C# を学習していますが、次の問題が発生しました。基本クラスと派生クラスの 2 つのクラスがあります。
class MyBase
{
public void MyMethod()
{
Console.WriteLine("MyBase::MyMethod()");
}
}
class MyDerived: MyBase
{
public void MyMethod()
{
Console.WriteLine("MyDerived::MyMethod()");
}
}
とりあえずキーワード抜きvirtual
で。これをコンパイルすると、クラスからoverride
非表示にしようとしているという警告が表示されます (これは当然のことです) 。MyMethod
MyBase
私がやりたいことは、派生クラスのインスタンスを持つ基本クラスからメソッドを呼び出すことです。私はこれを次のようにします:
MyDerived myDerived = new MyDerived();
((MyBase)myDerived).MyMethod();
virtual
メソッドに , etc. キーワードを指定しないと問題なく動作します。キーワードの組み合わせを入れようとしたところ、次の結果が得られました。
| MyBase::MyMethod | MyDerived::MyMethod | Result printed on the console |
| -----------------|---------------------|-------------------------------|
| - | - | MyBase::MyMethod() |
| - | new | MyBase::MyMethod() |
| virtual | new | MyBase::MyMethod() |
| virtual | override | MyDerived::MyMethod() |
表が明確であることを願っています。2 つの質問があります。
- 基底クラスから関数を呼び出すのは正しい方法ですか (
((MyBase)myDerived).MyMethod();
)? キーワードについては知ってbase
いますが、派生クラスの内部からしか呼び出すことができません。そうですか? - 最後のケース (
virtual
およびoverride
修飾子を使用) で、呼び出されたメソッドが派生クラスから来たのはなぜですか? それについて説明していただけますか?