重複の可能性:
ポリモーフィズムとは?
私は現在 Java のポリモーフィズムについて学んでいますが、それがどのように役立つのか理解できません。円または正方形を作成したい場合は、「形状」と呼ばれるスーパークラスを作成して、別の円と正方形のクラスを呼び出すことができますが、別のオブジェクトを作成しないのはなぜですか?
重複の可能性:
ポリモーフィズムとは?
私は現在 Java のポリモーフィズムについて学んでいますが、それがどのように役立つのか理解できません。円または正方形を作成したい場合は、「形状」と呼ばれるスーパークラスを作成して、別の円と正方形のクラスを呼び出すことができますが、別のオブジェクトを作成しないのはなぜですか?
生物学では、ポリモーフィズムとは、生物または種が多くの異なる形態または段階を持つことができる能力です。オブジェクト指向プログラミングで。同じ概念がプログラミングにも当てはまります。オブジェクトはさまざまな形式で存在できます。
この Employee クラスがあるとしましょう。
public class Employee{
public int computeSalary(){
//How would you compute the salary of an average employee
}
}
次に、BasePlusComission Employee というサブクラスがあります。
public class BasePlusCommissionEmployee extends Employee{
public int computeSalary(){
//Commision employee salary computation + Base Employee salary computation
}
}
そして、あなたはこの CommissionEmployee を持っています
public class CommissionEmployee extends Employee{
public int computeSalary(){
//Commision employee salary computation
}
}
ここで、この Employees の計算をポリモーフィックに処理したいと考えています。我々はできる
public void computeEmployeeSalary(Employee emp){
emp.computeSalary();
}
このメソッドは、あらゆる種類の Employee オブジェクトを受け取ります (つまり、Employee オブジェクトのサブクラスを渡すことができます)。それを渡すと、渡された従業員 (引数) が計算され、computeSalary() が呼び出されます。
BasePlusCommission Employee または CommissionEmployee を渡しても、動的メソッド ルックアップのおかげで、実装に応じて給与が計算されます。
別のより明確な説明。従業員のセットまたは配列を作成できます。
Employee[] employees = { new BasePlusComissionEmployee(), new CommissionEmployee,new Employee()};
これらのオブジェクトで給与を計算します。このように多態的に計算を処理できます
for(int i = 0; i < employees.length;i++){
employees[i].computeSalary();
}
配列宣言が従業員であっても、その実装は従業員配列の各オブジェクトのcomputeSalary()
各クラスの実装によって異なることに注意してくださいcomputeSalary();
円と正方形に render() メソッドがある場合、誰かが次のようなオブジェクト レンダラーを実装できます。
class Renderer {
Canvas c;
public Renderer(Canvas c) {
this.c = c;
}
public void draw(Shape shape) {
shape.render(c);
}
}
そのため、Renderer は任意の Canvas (または Canvas のサブクラス)、提供できる任意の Shape に描画できます。
別の方法として - ポリモーフィズムなしで - 次のように記述している必要があります。
class Renderer {
Canvas c;
public Renderer(Canvas c) {
this.c = c;
}
public void draw(Circle circle) {
circle.render(c);
}
public void draw(Square square) {
square.render(c);
}
public void draw(Triangle square) {
triangle.render(c);
}
// and so on...
}
次に、別のタイプのキャンバスがある場合はどうなるのだろうかと思うかもしれません。PaperCanvas、WoodCanvas、ClothCanvas など... レンダラーとシェイプはCanvas
、実装の詳細と描画先のキャンバスのすべてのタイプを知らなくても、抽象化を使用してそのオブジェクトと対話できます。