«как» включить полиморфизм?передаст унаследованный класс методу, который принимает полиморфизм базового класса? - PullRequest
1 голос
/ 18 сентября 2011

Прежде всего, я буду использовать virtual и override

, например, базовый класс A имеет метод A.do(), унаследованный класс B имеет B.do(), который переопределяет A.

если я вызову (B as A).do(), какой do() он выполнит?

или, если есть метод void mymethod(A a) {a.do()}, теперь я вызову его с помощью B b; mymethod(b), он выполнит b.do()?

Ответы [ 4 ]

3 голосов
/ 18 сентября 2011

Всегда будет вызываться самый верхний метод переопределения, т. Е. b.Do() или (b as A).Do() или ((A)b).Do() вызовут B.Do().

Я не знаю, как вызвать базовый методиз дочернего класса, если дочерний класс переопределяет его.

2 голосов
/ 18 сентября 2011
public class A
{
    public virtual void Do() { Console.Write("a"); }
    public void Do2() { Console.Write("a2"); }
}

public class B : A
{
    public override void Do() { Console.Write("b"); }
    public new void Do2() { Console.Write("b2"); }
}

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        A a = b;
        b.Do();               //b
        ( b as A ).Do();      //b
        a.Do();               //b
        ( (A)b ).Do();        //b

        ( b as A ).Do2();     //a2
        ( (A)b ).Do2();       //a2
        ( b ).Do2();          //b2
    }
}  

Выход:

b b b b
a2 a2 b2
1 голос
/ 18 сентября 2011
public class A
{
    public A() { }
    public void Do() { Console.Write("A"); }

}

public class B : A
{
    public B() { }
    public void Do() { Console.Write("B");  }
}

class Program
{
    static void Main(string[] args)
    {
        B b = new B();
        b.Do(); //<-- outputs B
        (b as A).Do(); //<-- outputs A
      }
}

компилятор предупреждает о сокрытии без переопределения :

Предупреждение 1 «ConsoleApplication5.B.Do ()» скрывает унаследованный элемент 'ConsoleApplication5.A.Do ()'. Используйте новое ключевое слово, если скрытие было предназначена. c: \ Program.cs 18 21 ConsoleApplication5

это потому, что вы ничего не переопределяете, а просто скрываете метод от A.

однако

public class A
{
    public A() { }
    public virtual void Do() { Console.Write("A"); }

}

public class B : A
{
    public B() { }
    public  override void Do() { Console.Write("B");  }
}

дважды вызывает B , когда метод переопределен.

1 голос
/ 18 сентября 2011

Это полностью зависит от того, был ли метод do () объявлен виртуальным или нет.Если он не является виртуальным, вызывается A.do ().Если он виртуальный, вызывается B.do ().Это ключевое слово virtual , которое включает полиморфизм и позволяет вызывать метод, независимый от типа ссылки.

В C # нет механизма, позволяющего напрямую вызывать виртуальный A.do ()метод из ссылки на объект B.Единственное исключение - использование base.do () внутри метода экземпляра класса B.

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