Динамический Полиморфизм: Сомнение - PullRequest
3 голосов
/ 27 января 2011

У меня есть этот код:

namespace ClassLibrary1
{
    public class Testing_Class
    {
        public string A()
        {
            int i = 3;
            Console.Write("Value if i" + i);
            string a = "John";
            return a;
        }


    }

    public class Testing : Testing_Class
    {
        public string A()
        {
            string a = "John";
            Console.Write(a);
            return a;
        }

    }



    public class Test
    {
        public void foo()
        {
            Testing MyTesting = new Testing();
            MyTesting.A(); //Dynamic Polymorphism ??

        }
    }

    }

Когда я вызываю MyTesting.A (), это динамический полиморфизм?Я не включил Virtual ключевое слово или Override здесь?

Ваши данные?

Ответы [ 3 ]

5 голосов
/ 27 января 2011

Нет, здесь нет полиморфизма.Вы получили не виртуальный вызов не виртуального метода.В отличие от некоторых других языков, методы и свойства в C # по умолчанию не являются виртуальными.

Чтобы продемонстрировать, что полиморфизм действительно работает, вам нужно:

  • Объявить метод виртуальнымв базовом классе
  • Используйте модификатор переопределения в производном классе
  • Используйте переменную с типом время компиляции базового класса для вызова, но с инициализациейэто с объектом производного типа.

Вот короткая, но полная программа, демонстрирующая все это:

using System;

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

class Derived : Base
{
    public override void Foo()
    {
        Console.WriteLine("Derived.Foo");
    }
}

class Test
{
    static void Main()
    {
        Base x = new Derived();
        x.Foo(); // Prints Derived.Foo
    }
}
3 голосов
/ 27 января 2011

Нет, это не полиморфизм. Вы создаете новый член с тем же именем в подклассе, не , переопределяющий член родительского класса. Если бы вы ссылались на свой экземпляр как на экземпляр родительского класса, он фактически вызвал бы член родительского класса, а не дочерний класс. Попробуйте:

        Testing_Class MyTesting = new Testing();
        MyTesting.A();
2 голосов
/ 27 января 2011

Вы не переопределяете, а прячетесь. Так как вы не отметили метод.

То есть вы можете скрыть виртуальные методы, но вы не можете переопределить обычные методы.

        class TestBase
        {
            public void GoForIt() {}
        }

        class Test : TestBase
        {
            public virtual new void GoForIt() {}
        }


        class Other : Test
        {
            public override void GoForIt() {}
            public new void GoForIt() {}
        }

если вы "забудете" ключевое слово new, компилятор предупредит вас:

Требуется ключевое слово new «Other.GoForIt ()», потому что он скрывает унаследованный член

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...