仮想メソッドを使用すると、メソッド/関数のデフォルトの動作が提供されることを学びました。私の質問は、派生クラスで「new」を使用して(基本クラスと同じ)同じ名前のメソッドを実装し、それをオブジェクトで個別に呼び出すことができる場合、仮想メソッドの使用はどうなるかということです。例えば;
class A
{
public void F()
{
//default behavior
}
public virtual void G()
{
//default behavior
}
}
class B:A
{
new public void F()
{
//new behavior from that of class A
}
public override void G()
{
//new behavior from that of class A
}
}
class Test
{
public static void Main(string[] args)
{
//For calling A's method use same compile time and run time object
A obj1 = new A();
//For calling B's method use compile time object of A and run time of B
A obj2 = new B();
obj1.F(); //O/P is A's method result
obj2.F(); //O/P is A's method result
obj1.G(); //O/P is A's method result
obj2.G(); //O/P is B's method result
}
私の質問は、クラス A と B の両方の同じコンパイル時オブジェクトと実行時オブジェクトを次のように使用して、デフォルトの動作と派生動作を提供できる場合に、クラス A の virtual G() が必要な理由です。
A obj1 = new A(); //for calling A's methods
B obj2 = new B(); //for calling B's methods
A obj3 = new B(); //for having default behavior of class A using B's run time object.
私が取得したのは、仮想の場合、同じコンパイルおよび実行時のタイプのオブジェクトをもう 1 つ作成する必要がないということだけです。タイプAのコンパイル時とタイプBの実行時の単一のオブジェクトで実現できます。