[解決済み] Javascriptのポリモーフィズムとは何ですか?
質問
私は、インターネット上で見つけたいくつかの可能性のある記事を読みました。 ポリモーフィズム . しかし、私はその意味と重要性をよく理解できなかったと思います。ほとんどの記事は、なぜそれが重要なのか、そして私がOOPで(もちろんJavaScriptで)ポリモーフィックな動作をどのように実現できるのかを語っていないのです。
どのように実装するのかアイデアがないので、コード例を提供することができませんので、私の質問は以下のとおりです。
- それは何ですか?
- なぜ必要なのか?
- どのように機能するのか?
- 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のものと非常に似ており、プロトタイプの唯一の関数がオーバーライドされているため、ここで継承を使用してもあまり得るものがありません。ポリモーフィック設計の威力は動作を共有することです。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】JavaScript版sleep()とは?)
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] jQueryの$という記号の意味は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] プロトタイプ継承 - 執筆中 [重複].
-
[解決済み] Node.jsでbase64エンコードされた画像をAmazon S3へアップロードする
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] jQueryの$という記号の意味は何ですか?
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?