0

次のように2つのクラスがあると仮定します。

class Fruit
{
    public string color { get; set; }
}
class Orange : Fruit
{
    public double diameter { get; set; }
}

そして、フルーツ変数内にオレンジ色のオブジェクトを作成します

Fruit fruit = new Orange() { color = "Orange", diameter = 10.0 };

// This line prints 10 even though the Fruit class doesn't contain a
// diameter property
Console.WriteLine( ( (Orange) fruit ).diameter );

直径のプロパティを含むオレンジ全体がフルーツ変数に押し込めるのはなぜですか? Fruit 変数が Fruit クラス定義によって制限されないのはなぜですか?

この例のように、代わりに新しい Orange を Orange 変数内に配置すると、どのような違いがありますか?

Orange fruit = new Orange() { color = "Orange", diameter = 10.0 };

私が見つけることができる唯一の違いは、変数に対して型テストを行う場合と、オブジェクトを使用する前にキャストする必要がないことです。しかし、それ以上のものがあるはずですよね?

4

3 に答える 3

5

Fruitは一般化ですOrangeが、 は特殊化です。特殊化されたオブジェクトは、既存の継承された属性を即興で作成したり、それに固有のプロパティを追加したりできます。

直径のプロパティを含むオレンジ全体がフルーツ変数に押し込めるのはなぜですか?

fruitは単なる参照変数ですが、Orangeおそらくヒープに存在する新しいオブジェクトを参照します。オブジェクトは、プロパティを保持するのOrangeに十分な大きさで定義されていdiameterます。スーパークラス参照型は、サブクラス オブジェクトを参照できます。このようにして、ポリモーフィズムを実装できます。このようなことを行うとfruit.color、実行時に、拡張され、オブジェクトが現在参照しているcolor任意のサブクラスのプロパティにアクセスできます。Fruitfruit

Fruit 変数が Fruit クラス定義によって制限されないのはなぜですか?

これを行う場合:

Fruit fruit = new Orange() { color = "Orange", diameter = 10.0 };

コードにポリモーフィズムを実装する機会を自分自身に与えています。Fruit型を引数として渡すメソッドを宣言すると、型参照変数を使用してプロパティにアクセスしたり、メソッドを特定の型Fruitに実際に制限することなくメソッドを呼び出すことができます。将来、特定の果物を からにFruit変更したい場合は、そのメソッドを再利用して、少なくとも で定義されたメソッドまたはプロパティがその特定の果物の種類で機能することを確認してください。OrangeAppleAppleFruitFruit

代わりに新しい Orange を Orange 変数内に配置すると、どのような違いがありますか

前述したように、特定の型参照を使用すると、ポリモーフィズムを利用できません。

于 2013-06-19T07:34:22.513 に答える
1

これはランタイムポリモーフィズムと呼ばれます。はフルーツを拡張し、 diameterOrangeなどの新しいプロパティを追加します。のオブジェクトを作成してに配置すると、そのプロパティは保持されますが、果物だけがこれらに対処できません。次に、直径を取得するために、もう一度を作成する必要があります。OrangeFruitOrangeFruit

ウィキペディアより

コンピューター サイエンスでは、ポリモーフィズムとは、さまざまなデータ型の値を統一されたインターフェイスを使用して処理できるようにするプログラミング言語の機能です。パラメトリック ポリモーフィズムの概念は、データ型と関数の両方に適用されます。さまざまな型の値を評価または適用できる関数は、多態性関数と呼ばれます。一般化された型のように見えるデータ型 (たとえば、任意の型の要素を持つリスト) は、そのような特殊化が行われる一般化された型と同様に、ポリモーフィック データ型と呼ばれます。

于 2013-06-19T07:38:48.043 に答える
0

これは基本的に、オレンジを作成していて、フルーツがオレンジの一般化であるためです。これは、実際の Orange オブジェクトの単なるラッパーです。重要なことは、Orange を作成してそれを Fruit として割り当てることですが、Fruit はオレンジです。もしあなたがそうするなら

Fruit _fruit = new Fruit()

それは違うでしょう。あなたはオレンジを作成しており、そのオレンジはフルーツから継承されているため、そのように書くことができます。

于 2013-06-19T07:36:00.027 に答える