昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧!

 

多态polymorphism

抽象讲法解释,就是使用单一界面操作多种型态的物件

继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(override)。

 

我们昨天已经确定了JS是用原型继承的方式实作面向对象继承的抽象概念。

上面我们也有说明了多态的定义,那要JS要怎么实作呢(gzanqifood)?

 

假设今天我们要创立一个角色,有魔法师和剑士两种职业,所以我们会把一些角色的基本设定写在父类别,角色的差异则会在子类别设定。

 

function Role(name,blood){

this.name = name ||“”;

this.blood = blood ||“”;

}

function SwordMan(name,blood){

Role.call(this,name,blood);

this.fight =“挥剑攻击”;

}

function Magician(name,blood){

Role.call(this,name,blood);

this.fight =“火球术!”;

this.cure =“治疗!”

}

 

SwordMan.prototype = new Role();

Magician.prototype = new Role();

 

var sword = new SwordMan(“剑士”,200);

var magic = new SwordMan(“魔法师”,100);

可以看到说,虽然sword与magic都有name与blood,但会发现显示出来的不一样,这是因为我们继承了Role所以在复写时候才能显示不一样,而不是只会统一显示。

 

所以可以这样说,JS透过「原型继承」的方式达成多态的override实作。

 

如果我们用类别继承来实作的话。

 

public class Role{

privite String name;

privite int blood;

public int getBlood(){

return blood;

}

public String getName(){

return name;

}

}

public class Magician extends Role{

public void fight(){

System.out.println(“火球术!”);

}

public void cure(){

System.out.println(“治疗!”);

}

}

public class SwordMan extends Role{

public void fight(){

System.out.println(“挥剑攻击!”);

}

}

封装

封装的目的是要隐藏实作的细节,只让抽象的界面暴露出来,使用者只需要知道界面就好。

举个例子来说,我们在利用时间方法Date()时候,我们不需要知道他是怎么实作的,只需要知道使用它可以得到一个时间的字串值。

 

但是JS本身并没有提供像JAVA语言的privite私有成员的方法,只能利用「闭包」来达到类似封装的概念。想知道闭包的话可以回去看DAY19喔!

所以严格来说,JS不是面向对象的语言!

 

今天就到这边,明天会带各位一步一步了解原型继承,一样如果有未附上来源及错误欢迎留言指正(ruisente)!