`
阳光暖暖
  • 浏览: 13265 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
最近访客 更多访客>>
社区版块
存档分类
最新评论

继承机制的实现:实例

阅读更多
1、类的定义采用构造函数-原型方式
定义polygon类及其子类-采用混合继承方式,即用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法。
function Polygon(iSides){
	this.sides=iSides;
}
Polygon.prototype.getArea=function(){
	return 0;
};
//三角形子类
function Triangle(iSides,iBase,iHeight){
	Polygon.call(this,iSides);//用对象冒充继承构造函数的属性
	this.base=iBase;
	this.height=iHeight;
}
Triangle.prototype=new Polygon();//用原型链继承prototype对象的方法
Triangle.prototype.getArea=function(){
	return 0.5*(this.base)*(this.height);
};
var oTriangle=new Triangle(3,4,8);
alert(oTriangle.getArea());//16
//矩形子类
function Rectangle(iLength,iWidth){
	Polygon.call(this,4);//用对象冒充继承构造函数的属性
	this.length=iLength;
	this.width=iWidth;
}
Rectangle.prototype=new Polygon();;//用原型链继承prototype对象的方法
Rectangle.prototype.getArea=function(){
	return (this.length*this.width);
}
var oRectangle=new Rectangle(4,8);
alert(oRectangle.getArea());//32

2、类的定义采用动态原型方式-继承无法利用动态原型方式实现
function Polygon(iSides){
	this.sides=iSides;
	if(typeof Polygon._initialized_=="undefined"){
		Polygon.prototype.getArea=function(){
			return 0;
		}
     }
	 Polygon._initialized_=true;
}
function Triangle(iLength,iWidth){
	Polygon.call(this,3);
	this.length=iLength;
	this.width=iWidth;
	if(typeof Triangle._initialized_=="undefined"){
	Triangle.prototype=new Polygon();
	Triangle.prototype.getArea=function(){
		return (this.length)*(this.width);
		}
	}
	Triangle._initialized_=true;
}
var oTriangle=new Triangle(4,8);
//控制台输出错误消息"oTriangle.getArea is not a function"
alert(oTriangle.getArea());

继承无法利用动态原型方式实现,原因在于prototype的特性,问题主要是由下面代码的位置因此的:Triangle.prototype=new Polygon(); 因为在代码运行前,对象已被实例化,并与原始的prototype对象联系在了一起。虽然用极晚绑定可使对原型对象的修改正确地表现出来,但替换 prototype对象却不会对该对象产生任何影响。只有未来的实例才会反映出这种改变,所以上面的例子会出现错误。代码进行下面的修改以后,就可以正常运行了。
function Polygon(iSides){
	this.sides=iSides;
	if(typeof Polygon._initialized_=="undefined"){
		Polygon.prototype.getArea=function(){
			return 0;
		}
     }
	 Polygon._initialized_=true;
}
function Triangle(iLength,iWidth){
	Polygon.call(this,3);
	this.length=iLength;
	this.width=iWidth;
	if(typeof Triangle._initialized_=="undefined"){
	Triangle.prototype.getArea=function(){
		return 0.5*(this.length)*(this.width);
		}
	}
	Triangle._initialized_=true;
}
Triangle.prototype=new Polygon();
var oTriangle=new Triangle(4,8);
alert(oTriangle.getArea());//16


3、其他的继承方式--zInherit
(1)利用inheritfrom重写Polygon类
function Polygon(iSides){
	this.sides=iSides;
}
Polygon.prototype.getArea=function(){
	return 0;
}
function Triangle(iBase,iHeight){
	Polygon.call(this,3);
	this.base=iBase;
	this.height=iHeight;
}
Triangle.prototype.inheritFrom(Polygon);
Triangle.prototype.getArea=function(){
	return 0.5*(this.base)*(this.height);
}
function Rectangle(iLength,iWidth){
	Polygon.call(this,4);
	this.length=iLength;
	this.width=iWidth;
}
Rectangle.prototype.inheritFrom(Polygon);
Rectangle.prototype.getArea=function(){
	return (this.length)*(this.width);
}
var oTri=new Triangle(4,8);//16
alert(oTri.getArea());
var oRec=new Rectangle(4,8);//32
alert(oRec.getArea());
alert(oTri.instanceOf(Polygon));//true
alert(oTri.instanceOf(Triangle));//true
alert(oRec.instanceOf(Polygon));//true
alert(oRec.instanceOf(Rectangle));//true

(2)动态原型支持
动态原型支持:原型链方式不能真正符合动态原型的主旨,即把类的所有代码放置在它的构造函数中。这种方法实现的原因是,使用inheritForm()方法时,并未重写prototype对象,只是为其加入方法而已。使用这种方法,即可避开原型链的限制,实现动态原型本意。
//dinamic prototype support
function Polygon(iSides){
	this.sides=iSides;
	if(typeof Polygon._initialized_=="undefined"){
		Polygon.prototype.getArea=function(){
			return 0;
		}
	}
	return Polygon._initialized_=true;
}
function Triangle(iBase,iHeight){
	Polygon.call(this,3);
	this.base=iBase;
	this.height=iHeight;
	if(typeof Triangle._initialized_=="undefined"){
		Triangle.prototype.inheritFrom(Polygon);
		Triangle.prototype.getArea=function(){
			return 0.5*(this.base)*(this.height);
		}
	}
	Triangle._initialized_=true;
}
function Rectangle(iLength,iWidth){
	Polygon.call(this,4);
	this.length=iLength;
	this.width=iWidth;
	if(typeof Rectangle._initialized_=="undefined"){
		Rectangle.prototype.inheritFrom(Polygon);
		Rectangle.prototype.getArea=function(){
			return (this.length)*(this.width);
		}
	}
	Rectangle._initialized_=true;
}
var tri=new Triangle(4,8);
alert(tri.getArea());//16
alert(tri.instanceOf(Polygon));//true
alert(tri.instanceOf(Triangle));//true
var rec=new Rectangle(4,8);
alert(rec.getArea());//32
alert(rec.instanceOf(Polygon));//true
alert(rec.instanceOf(Rectangle));//true

(3)多重继承支持
多重继承支持:zInherit库最有用的特性之一是支持多重继承,原型链不支持多重继承。同样利用inheritForm()方法实现。要继承属性和方法,inheritForm()方法必须与对象冒充一起使用,注意这里使用的是apply()方法。一般来说,按照继承属性的顺序继承方法比较好。
//multiple inheritance support
function ClassA(){
	this.messageA="the message of Class A";
	if(typeof ClassA._initialized_=="undefined"){
		ClassA.prototype.showMessageA=function(){
			alert(this.messageA);
		};
	ClassA._initialized_=true;
	}
}
function ClassB(){
	this.messageB="the message of Class B";
	if(typeof ClassB._initialized_=="undefined"){
		ClassB.prototype.showMessageB=function(){
			alert(this.messageB);
		};
	ClassB._initialized_=true;
	}
}
function ClassC(){
    ClassA.apply(this);
	ClassB.apply(this);
	this.messageC="the message of Class C";
	if(typeof ClassC._initialized_=="undefined"){
	    ClassC.prototype.inheritFrom(ClassA);
		ClassC.prototype.inheritFrom(ClassB);
		ClassC.prototype.showMessageC=function(){
			alert(this.messageC);
		};
	ClassC._initialized_=true;
    }
}	
var cClass=new ClassC();
cClass.showMessageA();//the message of Class A
cClass.showMessageB();//the message of Class B
cClass.showMessageC();//the message of Class C

分享到:
评论

相关推荐

    Java 实现继承实例代码

    在Java编程语言中,继承是面向对象特性之一,它允许我们创建一个类(子类或派生类)作为现有类(父类...通过学习这个实例,开发者能够更好地理解和运用Java的继承机制,从而在实际项目中实现更灵活、可扩展的代码结构。

    java script 继承的实现

    JavaScript 是一种广泛应用于 Web 开发的脚本语言,它的继承机制是其面向对象特性的重要组成部分。在 JavaScript 中,继承主要用于创建类之间的关系,允许子类(派生类)继承父类(基类)的属性和方法,从而实现代码...

    通过实例来剖析C#继承机制

    在`案例3:通过实例来剖析C#继承机制`中,你可能将看到如何创建一个实际的继承链,如何调用父类和子类的方法,以及如何利用继承实现特定的业务逻辑。通过这种方式,你可以更深入地理解C#继承的实际应用和优势。 总...

    JavaScript继承机制研究.pdf

    寄生式继承是一种特殊的继承机制,它通过在子类中创建一个父类的实例,然后将其作为子类的原型来实现继承。这种继承机制非常灵活和强大,但它也存在一些缺点,例如,它不能实现多重继承。 Class Extend Class ...

    深入剖析C#继承机制

    通过理解和掌握以上C#继承机制的知识点,开发者可以在设计和实现类结构时更灵活、高效地利用代码复用,同时保证代码的可扩展性和维护性。在实际项目中,合理运用继承可以极大地提高软件开发的效率和质量。

    JavaScript继承机制探讨及其应用.pdf

    2. 构造函数继承(Constructor Inheritance):这是 JavaScript中另一种常用的继承机制,通过将一个构造函数的 prototype 属性设置为另一个构造函数的实例,从而实现继承。 3. 混合继承(Mixins Inheritance):这是...

    《Java从入门到精通:实例版》源程序

    书中会通过实例来演示如何设计和使用类,以及如何利用继承和多态性来实现代码的复用和扩展。 3. **异常处理**:在编程中,异常是不可避免的。Java提供了丰富的异常处理机制,如try-catch-finally结构,帮助开发者...

    java继承类实例

    总的来说,这个程序展示了Java中类的继承机制,如何通过构造方法传递参数来初始化对象,以及子类如何覆盖或扩展父类的属性。理解这些概念对于进行Java编程至关重要,因为它们构成了面向对象设计的基础。通过这样的...

    通过实例来剖析C#继承机制.rar

    本实例将深入剖析C#中的继承机制,帮助你更好地理解和应用这一概念。 首先,继承的基本语法是使用冒号(:)来表示子类对基类的继承。例如: ```csharp public class BaseClass { // 基类成员 } public class ...

    面向对象抽象思维与java继承机制

    ### 面向对象抽象思维与Java继承机制 #### 一、抽象的含义 在面向对象编程中,**抽象**是一种关键概念,它涉及到从具体的实体中提取共同特征和行为的过程。通过抽象,程序员能够专注于对象的核心特征和功能,而...

    关于c++继承的一个实例,适用于初学者

    在C++编程语言中,继承是面向对象编程(OOP)的一个核心...学习这个实例将帮助初学者更好地理解C++中的继承机制及其在实际编程中的应用。通过动手实践,你可以加深对这一重要概念的理解,为以后的C++编程打下坚实基础。

    java 类的继承 基础理解

    Java 语言中的继承机制允许一个类继承另一个类的属性和行为,实现代码的重用和继承关系建模。在 Java 中,继承是通过使用 `extends` 关键字来实现的,格式为 `public 子类 extends 父类{}`。 继承的优点: 1. 代码...

    JavaScript继承与多继承实例分析.docx

    JavaScript的继承机制主要基于原型链,本文将深入探讨JavaScript的继承与多继承,并通过实例进行分析。 1. **JavaScript继承** - **原理**:JavaScript的继承主要是通过原型链(prototype chain)来实现的。每个...

    js继承.doc

    JavaScript,作为一种基于原型的面向对象语言,其继承机制与传统的类继承有所不同。在JS中,对象可以直接通过原型链实现继承,而无需像Java那样使用`extends`关键字。本文档将探讨JavaScript中的继承实现方式及其优...

    关于c#继承机制的详细概述

    【C#继承机制详解】 C#作为一门面向对象的编程语言,其继承性(Inheritance)是核心特性之一,旨在促进代码的复用和扩展,提高软件开发的效率。继承允许一个类(派生类)从另一个类(基类)获取特征和功能,同时还...

    javascript继承之工具函数二

    通过分析和实践`source.js`中的代码,我们可以更好地理解JavaScript的继承机制,掌握如何灵活地构建可扩展的对象模型。这不仅有助于提升我们的编程能力,也是面试中经常被问到的问题,因此深入学习和掌握这部分内容...

    浅析javascript原型继承机制

    ### 浅析JavaScript原型继承机制 #### 一、引言 JavaScript作为一种动态语言,其对象模型与传统的面向对象编程语言有所不同。在JavaScript中,并没有直接提供类的概念,而是通过原型来实现继承。本文将深入探讨...

    js继承实现示例代码

    通过上述示例代码,我们了解了如何在JavaScript中实现简单的继承机制。虽然这段代码提供了一种实现方式,但在实际项目中,更推荐使用ES6的类语法来实现继承,因为它更简洁且易于理解。此外,也可以考虑使用现有的库...

Global site tag (gtag.js) - Google Analytics