BaseClass obj = new SubClass(); // Subclass : BaseClass
OOPでそれはどういう意味ですか? SubClass オブジェクトを作成するだけでなく、いつそれを行いたいですか? 誰かが私に実生活の例を与えることができれば、私はそれを本当に感謝します.
obs: 仮想メソッドなどに関していくつかの副作用があることは理解していますが、ここで本当に混乱しているのは、これの概念と使用法についてです。
私が考えることができる最も一般的な理由は、複数のタイプのサブクラスがその変数に割り当てられる可能性があるスコープにあります。
Vehicle myWheels;
if (iHaveALicense) {
myWheels = new Car();
} else {
myWheels = new Bus();
}
非常に単純な例は、ファクトリ クラスについて考えることです。あるクラスがいくつかのクラスに依存している場合Factory<T>
、継承を使用して「具体的な」バージョンを注入できます。消費するクラスは、具体的なバージョンがどのように機能するかは気にしません。それが何らかのコントラクトを実装するだけです。
「それはOOPでどういう意味ですか?」- C# では、がSubClass
に関するすべてを継承し、プライベート メンバーを除いBaseClass
て 内のすべてにアクセスできることを意味します。BaseClass
これにより、 aBaseClass
が必要な場所ではどこでも aSubClass
を代わりに使用できます。この例では、抽象基本クラスを公開することで、ファクトリが何をすべきかを定義できます。継承クラスは、作業がどのように行われているかを消費者が気にすることなく、自由に動作を実装できます。
(これは 1 つの例にすぎません。継承は、悪用されなければ非常に強力なツールです。)
BaseClass を継承する別のクラスがあるとします。
public class NewSubClass : BaseClass
示した方法でオブジェクトを初期化すると、次のことができます。
BaseClass obj = new SubClass();
obj = new NewSubClass();
一方、そのようなもの:
SubClass obj = new SubClass();
obj = new NewSubClass();
まったくコンパイルされません。
それはポリモーフィズムと呼ばれるでしょう。
ベースクラスを引数として取る関数があるとします。
void my_function(Animal ani)
{
Console.WriteLine(ani.makeSound());
}
ここで、基本クラスで仮想メソッドを作成し、派生クラスでそれらをオーバーライドしてから、animalから派生したオブジェクトを関数に渡す場合。次に、makeSoundは、渡した派生オブジェクトに従ってサウンドを生成します。
そうすれば、音を出すすべての種類の動物に対してこの機能を作成する必要はありません。