использование виртуального и нового - PullRequest
0 голосов
/ 24 июля 2011

Насколько я вижу в C #,

виртуальные функции не только для полиморфизма,

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

я прав?

приведу пример:

class A
{
   public void func(int a)
     {
        ....
     }
}
class B:A
{
   public void func(int a)
     {
        ....
     }
}

сейчас я использую B x = new B(); поэтому компилятор предупредит меня, что метод в классе B скрывает тот, что в A. так что есть 2 решения:

1) пометить единицу в B ключевым словом New

2) сделать один в 'A' virtual и один в B - Overriding - это очистит предупреждение о сокрытии ..

единственная разница будет с Полиморфизм A x = new B();

если в классе B будет 'new' - всегда будет вызываться тот, кто из A, тогда как если я использую virtual и not , то новый механизм - тот из Б будет называться.

так что у виртуала есть 2 роли в .net: (пожалуйста исправьте меня, если я не прав)

1) разрешить скрывающее предупреждение (в среде неполиморфизма )

2) и, конечно, переопределение функций в yes-polymorphism enviroment .

пожалуйста, поправьте меня, если я ошибаюсь.

Ответы [ 3 ]

4 голосов
/ 24 июля 2011

Нет, виртуальные методы являются для полиморфизма. Ваше «решение» # 2 изменит поведение вызова x.func() с вызова реализации A на вызов реализации B - то есть сделает его полиморфным. Да, это убирает предупреждение - но это больше не «неполиморфная среда», поскольку вы сделали поведение полиморфным. Вы хотели это сделать или нет? Если вы сделали, то virtual и override это путь. Если вы этого не сделали, вам следует использовать new или переименовать метод.

Я бы настоятельно посоветовал бы вам избегать использования скрытия методов, если только вам это не нужно. Вам даже нужно B, чтобы получить от A? Если вы хотите дать ему другой метод с тем же именем, но другим значением, подумайте о том, чтобы сделать их отдельными классами. Лично я ухожу от наследства, если нет явных полиморфных отношений.

(Обратите внимание, что переопределение и перегрузка, между прочим, разные понятия. Вы имеете в виду переопределение здесь.)

0 голосов
/ 24 июля 2011

В основном ключевое слово «New» используется для преодоления предупреждения о сокрытии метода. В то время как виртуальное ключевое слово предназначено исключительно для полиморфизма, оно сообщает компилятору, если доступна переопределенная версия метода, затем запустите этот метод другим способом - запустите виртуальный метод.

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

В то время как ключевое слово «New» удаляет предупреждение и запускает только метод дочернего класса и скрывает родительский метод, поэтому для преодоления этого мы используем:

   public new void Method()
{
//Some code
Base.Method();

}

с помощью этого мы запускаем родительский метод и показываем метод родительского класса

0 голосов
/ 24 июля 2011

Предупреждение компилятора - только это.Это предупреждение о том, что ваша реализация func () неверна , вероятно, , поскольку она скрывает член от базового класса.

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

...