すべての拳、私は使用virtual
しますoverride
たとえば、基本クラス A には methodA.do()
があり、継承されたクラス B にはB.do()
A をオーバーライドするメソッドがあります。
を呼び出すと(B as A).do()
、どちらdo()
が実行されますか?
または、メソッドがある場合はvoid mymethod(A a) {a.do()}
、今それを呼び出すと、B b; mymethod(b)
実行されb.do()
ますか?
すべての拳、私は使用virtual
しますoverride
たとえば、基本クラス A には methodA.do()
があり、継承されたクラス B にはB.do()
A をオーバーライドするメソッドがあります。
を呼び出すと(B as A).do()
、どちらdo()
が実行されますか?
または、メソッドがある場合はvoid mymethod(A a) {a.do()}
、今それを呼び出すと、B b; mymethod(b)
実行されb.do()
ますか?
最上位のオーバーライド メソッドが常に呼び出されます。つまりb.Do()
、 or または(b as A).Do()
or((A)b).Do()
が呼び出されますB.Do()
。
子クラスがそれをオーバーライドする場合、子クラスから基本メソッドを呼び出す方法がわかりません。
public class A
{
public virtual void Do() { Console.Write("a"); }
public void Do2() { Console.Write("a2"); }
}
public class B : A
{
public override void Do() { Console.Write("b"); }
public new void Do2() { Console.Write("b2"); }
}
class Program
{
static void Main(string[] args)
{
B b = new B();
A a = b;
b.Do(); //b
( b as A ).Do(); //b
a.Do(); //b
( (A)b ).Do(); //b
( b as A ).Do2(); //a2
( (A)b ).Do2(); //a2
( b ).Do2(); //b2
}
}
出力:
b b b b
a2 a2 b2
do() メソッドが virtual と宣言されているかどうかに完全に依存します。仮想でない場合は、A.do() が呼び出されます。仮想の場合、B.do() が呼び出されます。これは、多態性を可能にし、参照の型に関係なくメソッドを呼び出すことを可能にするvirtualキーワードです。
C# には、B オブジェクト参照から仮想 A.do() メソッドを直接呼び出すことができるメカニズムはありません。唯一の例外は、クラス B のインスタンス メソッド内で base.do() を使用することです。
public class A
{
public A() { }
public void Do() { Console.Write("A"); }
}
public class B : A
{
public B() { }
public void Do() { Console.Write("B"); }
}
class Program
{
static void Main(string[] args)
{
B b = new B();
b.Do(); //<-- outputs B
(b as A).Do(); //<-- outputs A
}
}
コンパイラは、オーバーライドではなく非表示について 警告します:
警告 1 'ConsoleApplication5.B.Do()' は、継承されたメンバー 'ConsoleApplication5.A.Do()' を非表示にします。非表示が意図されている場合は、new キーワードを使用します。c:\Program.cs 18 21 ConsoleApplication5
that is since you are not overriding anything, but simply hiding the method from A.
however
public class A
{
public A() { }
public virtual void Do() { Console.Write("A"); }
}
public class B : A
{
public B() { }
public override void Do() { Console.Write("B"); }
}
calls B twice, when method is overridden.