これがC#でまったく可能かどうか疑問に思います:
ClassA c = new ClassB();
右側の部分にクラス名を付ける必要がある理由がわかりましたが、左側の部分にはクラス名を付ける必要はありません ( var c = new Anything()
)。この式の左右に異なる (おそらく何らかの形で接続されている) クラスの名前を明示的に入力します。私が間違っている?
これがC#でまったく可能かどうか疑問に思います:
ClassA c = new ClassB();
右側の部分にクラス名を付ける必要がある理由がわかりましたが、左側の部分にはクラス名を付ける必要はありません ( var c = new Anything()
)。この式の左右に異なる (おそらく何らかの形で接続されている) クラスの名前を明示的に入力します。私が間違っている?
演算子のオーバーロードによっても可能です。
class A
{
}
class B
{
public static implicit operator A(B b)
{
return new A();
}
}
A a = new B();
また
class A
{
public static implicit operator A(B b)
{
return new A();
}
}
class B
{
}
A a = new B();
これらは暗黙の変換です。
それらはポリモーフィズムに関連していないことに注意してください。それらは完全に分離されています (正反対ではなく、直交しています!)
そのように宣言する目的は、で宣言することと同じです
ISomeInterface x=new ClassThatImplementsSomeInterface();
それは、新しいクラスが提供しなければならない余分なものをすべて隠し、インターフェイス メソッドのみを使用してオブジェクト インスタンスと「対話」することです。
のベースClassA
である必要がありClassB
ます。
編集:
ほとんどの文献では、派生は英語ではISとして語られ、次のように書き留められることがわかります。
ClassB *IS* ClassA
ClassThatImplementsSomeInterface *IS* ISomeInterface
このように、宣言/割り当ては完全に正しいです。