EasyJS 教程五 - 抽象方法以及覆盖方法的调用
2013-04-20 12:21
197 查看
我个人认为抽象是OOP的关键核心之一,通过抽象,可以把系统变的更加灵活,更加容易扩展。一个优秀的架构师可以通过抽象具体的业务,打造一个易于扩展的系统,当然,这一切依赖于架构师的经验和对系统的了解程度,一个优秀的架构可以令事半功倍的效果,当然,一个差的架构也会令公司陷入沼泽地。我从业20年来,大大小小的项目也有几十个了,无论是成是败,都从中学到了很多宝贵的经验。好了,不多说了,继续谈如何做EasyJS中使用抽象方法。事实上,JS是不提供抽象方法的,我们只能采用在父类建立空函数的方法来实现,当然,也可以用以下的方式
来放置系统的错误调用。
其实,很多其他的JS-OOP类库也提供重载的机制,但是最困难的情况是无法建立抽象方法,在父类中调用子类的方法。我现在的公司采用的jsoop,一个很小但是使用率很高的oop类库,当时我们用这个类库开发的时候,经常会出现这样的情况,但是无法实现。
比如 ClassA 中有方法 m1, m2, m3. ClassB继承于ClassA,其中override了m2, m3. jsoop将为classB建立m1继承于ClassA。虽然jsoop也可以实现在重载类中调用父类方法,比如
但是,如果在ClassA的m2中,我们有这样的方法
classA:
在通常的OOP中,我们期望的是调用实际的m3,但是在JSOOP中无法实现,使得不得不用一下非常的方法实现,是的代码变得非常的丑陋并且很难维护。
在EasyJS中,非常简单的实现了方法中的调用转换及设置抽象方法。
这个是另外一个类 Bar
/app/com/fern/bar.js
通过开发窗口,我们import Bar并且创建一个实例。
在bar的代码中,并没有showValue这个函数,bar的showValue实际继承于BaseFoo. 当调用c.showValue的时候,
首先执行的是showBaseValue,所以输出p = 10,之后调用显示getValue(),这个时候,代码将返回到Bar中执行,返回30,所以接下来会打印30.
当调用public方法的时候,最重要的是不要使用this关键字,如果使用this,代码无法返回到子类完成子类的代码,必须使用self来处理。感兴趣的读者可以使用this来替代self,看看执行的效果。
this.method1 = function() { throw new Error("Please implement it in subclass."); }
来放置系统的错误调用。
其实,很多其他的JS-OOP类库也提供重载的机制,但是最困难的情况是无法建立抽象方法,在父类中调用子类的方法。我现在的公司采用的jsoop,一个很小但是使用率很高的oop类库,当时我们用这个类库开发的时候,经常会出现这样的情况,但是无法实现。
比如 ClassA 中有方法 m1, m2, m3. ClassB继承于ClassA,其中override了m2, m3. jsoop将为classB建立m1继承于ClassA。虽然jsoop也可以实现在重载类中调用父类方法,比如
m2: funciton() { ...... super.m2(); ...... }
但是,如果在ClassA的m2中,我们有这样的方法
classA:
m2: function() { ...... this.m3(); ...... }
在通常的OOP中,我们期望的是调用实际的m3,但是在JSOOP中无法实现,使得不得不用一下非常的方法实现,是的代码变得非常的丑陋并且很难维护。
在EasyJS中,非常简单的实现了方法中的调用转换及设置抽象方法。
这个是另外一个类 Bar
/app/com/fern/bar.js
(function() { var bar = function() { var self = arguments[0] || this; var _super = ExtendClass(this, JsLibrary.classForName("com.fern.BaseFoo"), self); var p = 30; //This is a private variable this.getValue = function() { return p; }; this.sayHello = function() { console.log("Hello from Bar"); }; }; JsLibrary.import("com.fern.BaseFoo", function() { JsLibrary.register("com.fern.Bar", bar); }, function(err) { throw err; }); })();
通过开发窗口,我们import Bar并且创建一个实例。
在bar的代码中,并没有showValue这个函数,bar的showValue实际继承于BaseFoo. 当调用c.showValue的时候,
this.showValue = function() { showBaseValue(); console.log("The value is: " + self.getValue()); };
首先执行的是showBaseValue,所以输出p = 10,之后调用显示getValue(),这个时候,代码将返回到Bar中执行,返回30,所以接下来会打印30.
当调用public方法的时候,最重要的是不要使用this关键字,如果使用this,代码无法返回到子类完成子类的代码,必须使用self来处理。感兴趣的读者可以使用this来替代self,看看执行的效果。
相关文章推荐
- 1 ubuntu下编译安装opencv2详细教程以及python调用opencv方法
- JS两种声明函数的方法以及调用顺序
- 如何动态调用DLL中类的方法以及属性
- 覆盖继承的问题以及解决方法(条款33)
- 通过反射获取类属性字段 以及 调用类方法
- 总结Qt5调用windows本地程序的三个方法以及异同
- c#调用c++程序(DLL方法,以及opencv,运行开源的人脸识别seetaface)
- JVM学习之:浅谈方法调用以及Override/Overload的原理
- (andorid)屏蔽home键和back键的方法,以及调用振动的方法
- Android逆向之旅---某直播APP的协议加密原理分析以及调用加密方法进行协议参数构造
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- 【廖雪峰 python教程 课后题 切片】利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
- 一个java程序/项目检测工具.方法是否被调用以及频率
- oracle pl/sql应用解析以及存储过程对应到java中的调用方法
- 关于ASP.NET同页面内【用户控件与父页面】以及【用户控件与用户控件】之间方法调用/传值 一点点经验
- IOS修改webView背景透明以及IOS调用前台js的方法
- Blue框架的基本教程三:服务端调用客户端的方法
- Python调用C函数的方法以及如何编写Python的C扩展
- 阿里云centos7 安装mysql 5.7教程以及中间遇到的问题处理方法
- 当前iframe调用另一个iframe中的元素以及方法