1

子によってオーバーライドされる同じメソッド(sampleMethod)を持つ2つのクラスがあるとしましょう:ObjectParentとObjectChild

ObjectChild ExampleVariable = new ObjectChild();
(ExampleVariable as ObjectParent).sampleMethod();

これは、ObjectChildまたはObjectParentからsampleMethodを呼び出しますか?

ObjectChildからsampleMethodを呼び出すと思いますが、その仮定に基づいて一連のコードをスローする前に確認したいと思います。

4

5 に答える 5

2

(非表示ではなく)オーバーライドされた場合、実行時に子クラスの実装が使用されます。それがポリモーフィズムの要点の1つです。オブジェクトの実際の実行時型が何であるかを知る必要はなく、それを基本クラスのインスタンスとして扱うことができます。

于 2012-11-07T07:49:46.743 に答える
1

Jon Skeetが言ったように、「それが(単に隠されるのではなく)適切にオーバーライドされる仮想メソッドであると仮定すると、ObjectChild実装を呼び出します。」

ここでは、親クラスのメソッドの前に仮想キーワードを使用し、子クラスのメソッドの前にキーワードをオーバーライドしたと想定しています。

それ以外の場合...考慮すべき2つのことがあります:

  1. 親クラスのメソッドが隠されているだけかどうか。このようなケースを調査するには、次のリンクを参照してください:http: //msdn.microsoft.com/en-us/library/ms173153.aspxおよび http://msdn.microsoft.com/en-us/library/ 6fawty39.aspx

  2. メソッドに提供されるアクセスのレベル(親と子で異なる場合があります)。オーバーライドメソッドと仮想メソッドの両方に同じアクセスレベル修飾子が必要ですが、それらを使用していない場合は選択肢があります。

上記の検討の後でのみ、状況について結論を出すことができます。

于 2012-11-07T08:14:17.347 に答える
1

これは、ObjectChildまたはObjectParentからsampleMethodを呼び出しますか?

それが(単に隠されるのではなく)適切にオーバーライドされる実際の仮想メソッドであると仮定すると、ObjectChild実装を呼び出します。これが仮想メソッドの要点です。コンパイル時に実行時の型を知る必要はありません。たとえば、どの実装を使用するかを知らなくてもStream.Read、(たとえば、をStreamパラメーターとして使用して)を使用してメソッドを作成できます。実行時に、そのコードがネットワーク、メモリ、ディスクから読み取られる可能性があります...私のメソッドのコードは、大文字と小文字を区別しません。Stream

これを示す短いが完全なプログラム:

using System;

class ObjectParent
{
    public virtual void Foo()
    {
        Console.WriteLine("ObjectParent.Foo");
    }
}

class ObjectChild : ObjectParent
{
    public override void Foo()
    {
        Console.WriteLine("ObjectChild.Foo");
    }
}

class Test
{
    static void Main()
    {
        // Simpler code to demonstrate the point
        ObjectParent parent = new ObjectChild();
        parent.Foo(); // Prints ObjectChild.Foo
    }
}
于 2012-11-07T07:50:17.610 に答える
1

sampleMethodがand..thenyesであるかどうかによって異なりvirtualますoverriden。しかし、持っているかもしれません:

ObjectParent ExampleVariable = new ObjectChild();
ExampleVariable.sampleMethod();

virtualこれは、このメソッドが多形であり、派生型によってオーバーライドできることを意味します。overriddenこの場合、派生クラスが基本クラスからのsampleMethodの実装を実際にオーバーライドすることを意味します。答えはキーワード自体にあると思います。

于 2012-11-07T07:51:10.970 に答える
1

はい、ObjectChild.sampleMethod()簡単にテストできるので、次のように呼び出します。

class ObjectParent
{
    public virtual void sampleMethod()
    {
        Console.WriteLine("Parent");
    }
}

class ObjectChild : ObjectParent
{
    public override void sampleMethod()
    {
        Console.WriteLine("Child");
    }
}
于 2012-11-07T07:51:37.013 に答える