[JavaScript] JavaScript объектно-ориентированное проектирование (3): статьи интерфейс полиморфизм

В первом из них мы вводим основной закон практику наследования JavaScript, через Object.prototype мы вольны решать, какие объекты вы хотите наследовать от объекта, вы можете также расширить свойство объекта и методы, доступное в настоящее время (и C # метод расширения имеют ту же цель Мяо), в этом, мы хотим ввести еще одну характеристику объектно-ориентированного: полиморфизм (полиморфизм).


В первом из них мы вводим основной закон практику наследования JavaScript, через Object.prototype мы вольны решать , какие объекты вы хотите наследовать от объекта, вы можете также расширить свойство объекта и методы , доступное в настоящее время (и C # метод расширения имеют ту же цель Мяо), в этом, мы хотим ввести еще одну характеристику объектно-ориентированного: полиморфизм (полиморфизм) .

Полиморфизм определено, что такое же поведение (поведение), по-разному реагируют на различные объекты. Примеры животного или автомобиль является наиболее часто цитируемых, например, у меня есть объект автомобилей, который имеет метод GetName (), который мы определяем HondaCRV и ToyotaWish два объекта, чтобы наследовать его, во всей ее полноте определяется как:

   1: Функция автомобиля () {
   2:   
   3: this.name = "БАЗА";
   4:   
   5: this.getName = функция () {вернуть this.name; };
   6: this.drive = функция () {document.write ( "Драйв БАЗА 
"); };
   7:   
   8:}
   9:   
  10: Функция HondaCRV () {
  11: HondaCRV.prototype.name = "Honda CRV";
  12:}
  13:   
  14: HondaCRV.prototype = новый автомобиль ();
  15:   
  16: Функция ToyotaWish () {
  17: ToyotaWish.prototype.name = "TOYOTA Wish";
  18:}
  19:   
  20: ToyotaWish.prototype = новый автомобиль ();

Тогда этот вызов в основной программе:

   1: Функция инициализации () {
   2:   
   3: document.write (. (Новый автомобиль ()) GetName () + " 
«);
   4: document.write ((новый HondaCRV ()) GetName () + ". 
«);
   5: document.write (. (Новый ToyotaWish ()) GetName () + " , 
«);
   6:   
   7:}

Такие результаты могут быть получены:

образ

Эта программа является типичным примером использования полиморфизма, хотя она разделяет переменную родительский класс, но мы можем также сделать дополнительную емкость полиморфным. Один из способов управлять () в автомобиле, и теперь мы хотим HondaCRV и ToyotaWish перезаписи, программа выглядит следующим образом:

   1: Функция автомобиля () {
   2:   
   3: this.name = "БАЗА";
   4:   
   5: this.getName = функция () {вернуть this.name; };
   6: this.drive = функция () {document.write ( "Драйв БАЗА 
"); };
   7:   
   8:}
   9:   
  10: Функция HondaCRV () {
  11: HondaCRV.prototype.name = "Honda CRV";
  12: HondaCRV.prototype.drive = функция () {
  13: document.write ( "Drive HONDA CRV в настоящее время. 
");
  14:};
  15:}
  16:   
  17: HondaCRV.prototype = новый автомобиль ();
  18:   
  19: Функция ToyotaWish () {
  20: ToyotaWish.prototype.name = "TOYOTA Wish";
  21: ToyotaWish.prototype.drive = функция () {
  22: document.write ( "Drive Toyota Wish в настоящее время. 
");
  23:};
  24:}
  25:   
  26: ToyotaWish.prototype = новый автомобиль ();

Обратите внимание, что теперь мы используем Object.prototype. [Способ] способ переопределить метод родительского объекта, объект для выполнения своих действий. Затем измените основную программу:

   1: Функция инициализации () {
   2:   
   3: document.write (. (Новый автомобиль ()) GetName () + " 
«);
   4: document.write ((новый HondaCRV ()) GetName () + ". 
«);
   5: document.write (. (Новый ToyotaWish ()) GetName () + " , 
«);
   6:   
   7:. (Новый автомобиль ()) привод ();
   8:. (Новый HondaCRV ()) привод ();
   9:. (Новый ToyotaWish ()) привод ();
  10:   
  11:}

Выполнить это, мы получаем следующие результаты:

образ

Вот и я думаю , что вы должны знать , как использовать функцию JavaScript в мульти-государственной практике, и мы будем делать , и есть весьма полиморфные функции , связанные с: интерфейс (интерфейс) .

Написал # / Java / программы VB объектно-ориентированный язык C такие люди должны знать, что интерфейс является договор (контракт), он обладает сильным обязательным, если есть ссылка на интерфейс, но не практиковать, то он будет брошен ошибка компиляции, так что не беспокойтесь об интерфейсе не практично, однако, JavaScript неплотно типа литературного языка, не способ обеспечить такую ​​проверку, так что эта часть, которую мы не должны делать это самим, но некоторые помощник JavaScript объект под рукой, вы можете помочь нам что-то решать.

Например, мы заказали интерфейс IRateCalculator, который имеет метод getAmount ():

   1: Функция IRateCalculator () {
   2: // метод контракта.
   3:      this.getAmount = function (amount) { throw "ERROR_INTERFACE_METHOD_MUST_BE_IMPLEMENTED"; };
   4:  }

然后我们定义了两个对象 SavingCalculator 与 LoanCalculator,皆实践 IRateCalculator 界面,定义自己的 getAmount() 方法:

   1:  SavingCalculator.prototype = new IRateCalculator();
   2:   
   3:  function SavingCalculator(amount) {
   4:   
   5:      this.amount = amount;
   6:   
   7:      SavingCalculator.prototype.getAmount = function (amount) {
   8:          return amount * 1.01; // 1%
   9:      };
  10:   
  11:  }
  12:   
  13:  LoanCalculator.prototype = new IRateCalculator();
  14:   
  15:  function LoanCalculator(amount) {
  16:   
  17:      this.amount = amount;
  18:   
  19:      LoanCalculator.prototype.getAmount = function (amount) {
  20:          return amount * 1.20; // 20%
  21:      };
  22:   
  23:  }

在主程序中我们要使用 SavingCalculator 和 LoanCalculator 计算十万元的本利和:

   1:  function init() {
   2:   
   3:      var saving = new SavingCalculator();
   4:      var loan = new LoanCalculator();
   5:   
   6:      // check interface.
   7:      console.log(IRateCalculator.prototype);
   8:      console.log(SavingCalculator.prototype);
   9:      console.log(typeof SavingCalculator.prototype.getAmount);
  10:   
  11:      if (IRateCalculator.prototype.isPrototypeOf(saving))
  12:          document.write("Saving's Rate Amount of 100000 is: " + saving.getAmount(100000) + "
");
  13:      else
  14:          document.write("Your code is not implement IRateCalculator interface.");
  15:   
  16:      if (IRateCalculator.prototype.isPrototypeOf(loan))
  17:          document.write("Loan's Rate Amount of 100000 is: " + loan.getAmount(100000) + "
");
  18:      else
  19:          document.write("Your code is not implement IRateCalculator interface.");
  20:   
  21:  }

执行结果为:

образ

看起来很平常吧,但其实问题有两个:

1. 主程序必须要确认对象有实践 IRateCalculator 界面。
2. 主程序必须检查对象确实实践了 IRateCalculator.getAmount() 方法。

针对第一个问题,我们可以利用 Object.prototype.isPrototypeOf() 方法来确认,它可以检查界面是否被某对象实践,因此我们检查了这件事,并决定是否要调用 getAmount() 方法。然而第二个问题仍无解,因为 Object.prototype 无法回传更多的类型资讯,因此无法得到确实的类型比对依据,无法很确定 SavingCalculator 和 LoanCalculator 的 getAmount() 确实就是 IRateCalculator.getAmount() 方法,只能够暂时信任对象实践的确实是界面所定义的方法。

善用多态,可以创造出很多不同的 JavaScript 对象应用,而且它也能做为 Design Pattern 的入口基石,让编写可高度重复使用的 JavaScript 程序能更加容易。

原文:大专栏  [JavaScript] JavaScript 面向对象设计 (3) : 多态与界面篇


рекомендация

отwww.cnblogs.com/chinatrump/p/11496454.html