2

C# でシャドーイングの概念を理解しようとしています。これは私のコードであり、期待どおりに動作していません。

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

public class Dog : Animal
{
    public new void Foo()
    {
        Console.WriteLine("Foo Dog");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Dog dog1 = new Dog();
        ((Animal)dog1).Foo();
        Animal dog2 = new Dog();
        dog2.Foo();
    }
}

のコードMainが実行されるとFoo()、基本クラスから ( Animal) が呼び出され、シャドウイングについて読んだことから、Foo()fromDogを呼び出す必要があります。誰かが私が欠けているものを説明できますか?

私の例はこれによると: https://msdn.microsoft.com/en-us/library/ms173153.aspx

更新: これは msdn の例です:

class Program
{
    static void Main(string[] args)
    {
        BaseClass bc = new BaseClass();
        DerivedClass dc = new DerivedClass();
        BaseClass bcdc = new DerivedClass();

        // The following two calls do what you would expect. They call
        // the methods that are defined in BaseClass.
        bc.Method1();
        bc.Method2();
        // Output:
        // Base - Method1
        // Base - Method2


        // The following two calls do what you would expect. They call
        // the methods that are defined in DerivedClass.
        dc.Method1();
        dc.Method2();
        // Output:
        // Derived - Method1
        // Derived - Method2


        // The following two calls produce different results, depending 
        // on whether override (Method1) or new (Method2) is used.
        bcdc.Method1();
        bcdc.Method2();
        // Output:
        // Derived - Method1
        // Base - Method2
    }
}

class BaseClass
{
    public virtual void Method1()
    {
        Console.WriteLine("Base - Method1");
    }

    public virtual void Method2()
    {
        Console.WriteLine("Base - Method2");
    }
}

class DerivedClass : BaseClass
{
    public override void Method1()
    {
        Console.WriteLine("Derived - Method1");
    }

    public new void Method2()
    {
        Console.WriteLine("Derived - Method2");
    }
}

bcdc.Method1()実行されるとMethod1()、派生クラスからが呼び出されますが、これは私の例では当てはまりません。

4

3 に答える 3

0

行では((Animal)dog1).Foo()、最初にオブジェクト dog1 が Dog から Animal 型に変換されます。したがって、基本クラス Animal のメソッドを呼び出します。

dog クラスのFooメソッドでnewキーワードの代わりにoverrideを使用すると、期待どおりの結果が得られます (つまり、DogクラスのFooメソッドが呼び出されます)。

コードでは、dog2 は の代わりに のAnimal dog2 = new Dog();オブジェクトとして作成されます。したがって、メソッドを呼び出すと、クラス内のメソッドが呼び出されます。AnimalDogFooAnimal

次のコードを使用して、 DogクラスのFooメソッドを呼び出すことができます。ここで、変数は元々Dog クラスのコンストラクターから作成されているため、からクラスへの変換が可能です。((Dog)dog2).Foo();AnimalDogdog2

于 2015-06-22T09:51:24.470 に答える