новое ключевое слово в сигнатуре метода

Так как при переходе на RTM есть много изменений, я обновил шаблон SPA, который использует контроллер WebApi для всех входов в систему и т. Д. Это действительно крутой шаблон, если вы его еще не видели.

Я поместил весь свой код здесь: https://github.com/s093294/aspnet-identity-rtm/tree/master

(Обратите внимание, это только для вдохновения. Я только заставил это работать и больше ничего. У меня тоже есть ошибка или два).

112
задан Filburt 29 July 2012 в 11:27
поделиться

6 ответов

Новая ссылка на ключевое слово из MSDN:

Ссылка на MSDN

Вот пример, который я нашел в сети из Microsoft MVP, который имеет смысл: Ссылка на оригинал

public class A
{
   public virtual void One();
   public void Two();
}

public class B : A
{
   public override void One();
   public new void Two();
}

B b = new B();
A a = b as A;

a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B

Переопределение можно использовать только в очень особых случаях. Из MSDN:

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

Таким образом, ключевое слово new необходимо для того, чтобы вы могли «переопределить» невиртуальные и статические методы.

98
ответ дан 24 November 2019 в 02:51
поделиться

Нет, на самом деле это не «новое» (простите за каламбур). В основном он используется для «сокрытия» метода. IE:

public class Base
{
   public virtual void Method(){}
}

public class Derived : Base
{
   public new void Method(){}
}

Если вы затем сделаете это:

Base b = new Derived();
b.Method();

Будет вызван метод в базе, а НЕ в производном.

Дополнительная информация: http: // www. akadia.com/services/dotnet_polymorphism.html

Re your edit: В приведенном мною примере, если вы должны «переопределить» вместо использования «new», то при вызове b.Method (); Метод производного класса будет вызываться из-за полиморфизма.

59
ответ дан 24 November 2019 в 02:51
поделиться

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

Имейте в виду, что создание «нового» члена не является полиморфным. Если вы приведете объект к базовому типу, он не будет использовать член производного типа.

Если у вас есть базовый класс:

public class BaseClass
{
    public void DoSomething() { }
}

И затем производный класс:

public class DerivedType : BaseClass
{
    public new void DoSomething() {}

}

Если вы объявите тип DerivedType , а затем приведите его, метод DoSomething () не является полиморфным, он вызовет метод базового класса, а не производный.

BaseClass t = new DerivedType();
t.DoSomething();// Calls the "DoSomething()" method of the base class.
22
ответ дан 24 November 2019 в 02:51
поделиться

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

3
ответ дан 24 November 2019 в 02:51
поделиться

Из документации:

Если методу в производном классе предшествует ключевое слово new, метод определяется как независимый от метода в базовом классе.

Что на практике это означает:

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

Лично я стараюсь избегать ключевого слова «new» обычно это означает, что я неправильно понял иерархию классов, но бывают случаи, когда это может быть полезно. Одно место предназначено для управления версиями и обратной совместимости.

Там '

7
ответ дан 24 November 2019 в 02:51
поделиться

From MSDN :

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

1
ответ дан 24 November 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: