Как добиться полиморфизма в C #

1

Я новичок в С#. Я пытался проверить, как полиморфизм может быть достигнут на С#, и я запутался в том, что одним из способов достижения этой цели является достижение полиморфизма. Я использую приведенный ниже код, а выход - метод A.

class A
{    
    public void Display()
    {
        Console.WriteLine("A Method");
    }
}
class B : A
{
    public void Display()
    {
        Console.WriteLine("B Method");
    }
}

class Polymorphism
{
    public static void Main(string[] args)
    {
        A a = new B();
        a.Display();
        Console.ReadKey();
    }
}


Но когда я определяю метод Display(), как указано ниже, вызывается метод B.

class A
{    
    public virtual void Display()
    {
        Console.WriteLine("A Method");
    }
}
class B : A
{
    public override void Display()
    {
        Console.WriteLine("B Method");
    }
}

Итак, каким образом я достигаю полиморфизма и какова разница между тем и другим способом и который должен быть предпочтительным для переопределения. Любая помощь будет заметна.

Теги:

3 ответа

4
Лучший ответ

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

В первом случае, вызывается метод, потому что у вас есть ссылка на A A, и не виртуальные методы разрешаются во время компиляции. Объекту B разрешается ссылаться на переменную A потому что B - это A (Обратите внимание, что опускание объекта и вызов результата вызовет метод B: ((B)a).Display();)

Во втором случае вызывается метод B потому что метод является виртуальным, а виртуальные методы разрешаются во время выполнения, основываясь на фактическом типе объекта, а не на типе ссылки, в которой он хранится.

  • 0
    @cdhowle Это означает, что второй пример может быть подвергнут полиморфизму во время выполнения ...
2

Проще говоря, полиморфизм - это когда вы можете обрабатывать производный объект, как если бы он был объектом предка, и иметь функциональность всех производных функций правильно.

В первом примере вы скрываете метод предков, поэтому, если вы обрабатываете производный объект как предка, тогда он ведет себя как предок. Это не полиморфно.

Во втором примере вы переопределяете метод предков, поэтому, когда вы рассматриваете объект как предок, он по-прежнему ведет себя как производный объект. Это полиморфно.

Хотя это простая концепция, есть много не очень простых побочных эффектов и условий, которые идут вместе с ней. Например, см. Принцип замещения Лискова (который я не буду здесь делать). В игре есть и другие принципы и теории. Но достаточно понять, что полиморфизм в С# достигается в основном за счет наследования (хотя его также можно достичь с помощью ducktyping с динамическими объектами и с типичной типизацией дженериков).

Существует также несколько типов полиморфизма... см. Запись в Википедии:

http://en.wikipedia.org/wiki/Polymorphism_(computer_science)

1

В одном случае вы делаете метод скрытие и в другом переопределении it.Don't брезгует помощью Google, вы получите очень полезные статьи или answers.Even на qaru.site/questions/101193/..., вы получите множество подобных вопросов.

   class A
{    
    public void Display()
    {
        Console.WriteLine("A Method");
    }
}
class B : A
{
    public void Display()
    {
        Console.WriteLine("B Method");
    }
}

В приведенном выше примере вы выполняете скрытие или метод hiding.You можете получить даже тот же результат, если вы используете новое ключевое слово, как в нижнем коде. Если вы используете, не записывайте переопределение в методе дочернего класса, метод в производном класс не переопределяет метод в базовом классе, он просто скрывает его.

   public new void Display()
        {
            Console.WriteLine("B Method");
        }

Модификатор переопределения требуется для расширения или изменения абстрактной или виртуальной реализации унаследованного метода, свойства, индексатора или события. Таким образом, для переопределения вы должны использовать ключевое слово переопределения, которое вы используете во втором примере.

Проще говоря, если метод не переопределяет производный метод, он скрывает его. Метод override предоставляет новую реализацию элемента, который унаследован от базового класса.

Вы также можете проверить здесь, в MSDN, когда нужно скрывать метод или когда делать переопределение.

Основываясь на обсуждении в разделе комментариев, я прикрепляюсь ниже кода. Надеюсь, это поможет вам.

    using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
             A a=new A();
             a.Display();//Parent Method
             B b =new B();
             b.Display();//Child Method
             **A ab = new B();
             ab.Display();//Parent Method**
             Console.ReadKey();
             Parent parent = new Parent();
             parent.Display();//Parent Method
             Child child = new Child();
             child.Display();//Child Method
             **Parent ParentChild = new Child();
             ParentChild.Display();//Child Method**
             Console.ReadKey();
        }
        class A
        {
            public virtual void Display()
            {
                Console.WriteLine("Parent Method");
            }
        }
        class B : A
        {
            public void Display()
            {
                Console.WriteLine("Child Method");
            }
        }

        class Parent
        {
            public virtual void Display()
            {
                Console.WriteLine("Parent Method");
            }
        }
        class Child : Parent
        {
            public override void Display()
            {
                Console.WriteLine("Child Method");
            }
        }
    }
}
  • 0
    Метод или функция базового класса доступны дочернему (производному) классу без использования ключевого слова «переопределение». Компилятор скрывает функцию или метод базового класса. Эта концепция известна как скрытие или скрытие метода. В теневом копировании или скрытии методов дочерний (производный) класс имеет свою собственную версию функции, эта же функция также доступна в базовом классе.
  • 0
    Если мы используем переопределение, оно изменяет \ переопределяет определение виртуального метода базового класса в своем дочернем классе.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню