1. ホーム
  2. javascript

[解決済み] Javascriptのポリモーフィズムとは何ですか?

2022-11-26 23:35:52

質問

私は、インターネット上で見つけたいくつかの可能性のある記事を読みました。 ポリモーフィズム . しかし、私はその意味と重要性をよく理解できなかったと思います。ほとんどの記事は、なぜそれが重要なのか、そして私がOOPで(もちろんJavaScriptで)ポリモーフィックな動作をどのように実現できるのかを語っていないのです。

どのように実装するのかアイデアがないので、コード例を提供することができませんので、私の質問は以下のとおりです。

  1. それは何ですか?
  2. なぜ必要なのか?
  3. どのように機能するのか?
  4. javascriptでこのポリモーフィックな動作を実現するにはどうしたらよいでしょうか?

私はこの例を持っている。しかし、それはこのコードの結果がどうなるかを容易に理解することができます。ポリモーフィズムそのものについて、明確なアイデアはありません。

function Person(age, weight) {
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo.";
    }
}
function Employee(age, weight, salary) {
    this.salary = salary;
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo " +
        "and earns " + this.salary + " dollar.";
    }
}

Employee.prototype = new Person();
Employee.prototype.constructor = Employee;
  // The argument, 'obj', can be of any kind
  // which method, getInfo(), to be executed depend on the object
  // that 'obj' refer to.

function showInfo(obj) {
    document.write(obj.getInfo() + "<br>");
}

var person = new Person(50,90);
var employee = new Employee(43,80,50000);
showInfo(person);
showInfo(employee);

どのように解決するのですか?

ポリモーフィズムはオブジェクト指向プログラミング(OOP)の信条の1つです。これは、動作を共有し、特定の動作で共有された動作を上書きできるようにオブジェクトを設計する練習です。ポリモーフィズムは、これを実現するために継承を利用します。

OOPでは、すべてのものはオブジェクトとしてモデル化されると考えられています。この抽象化は、車のナットとボルトに至るまで、または単に年式、メーカー、およびモデルを持つ車のタイプのような広い範囲まで行うことができます。

ポリモーフィックな車のシナリオを持つには、基本となる車種があり、次に車を継承するサブクラスがあり、車が持つ基本動作の上に、独自の動作を提供します。たとえば、サブクラスは TowTruck で、年式と車種を持ちますが、IsTowing のフラグのような基本的なものからリフトの仕様のような複雑なものまで、いくつかの追加の動作とプロパティを持つ可能性があります。

人と従業員の例に戻ると、すべての従業員は人ですが、すべての人は従業員ではありません。つまり、peopleはスーパークラスで、employeeはサブクラスになります。人には年齢や体重があるかもしれませんが、給料はありません。社員は人ですから、本来は年齢や体重を持ちますが、社員ですから給料も持ちます。

そこで、これを容易にするために、まずスーパークラス(Person)を書き出すことにします。

function Person(age,weight){
 this.age = age;
 this.weight = weight;
}

そして、私たちはパーソンに情報を共有する能力を与えます。

Person.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo.";
};

次に、PersonのサブクラスであるEmployeeを用意したいと思います。

function Employee(age,weight,salary){
 this.age = age;
 this.weight = weight;
 this.salary = salary;
}
Employee.prototype = new Person();

そして、getInfoの動作を上書きして、よりEmployeeに適した動作を定義することにします。

Employee.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo " +
    "and earns " + this.salary + " dollar.";  
};

これらは、あなたのオリジナルのコードの使用と同様に使用することができます。

var person = new Person(50,90);
var employee = new Employee(43,80,50000);

console.log(person.getInfo());
console.log(employee.getInfo());

しかし、Employeeのコンストラクタはpersonのものと非常に似ており、プロトタイプの唯一の関数がオーバーライドされているため、ここで継承を使用してもあまり得るものがありません。ポリモーフィック設計の威力は動作を共有することです。