Так как при переходе на RTM есть много изменений, я обновил шаблон SPA, который использует контроллер WebApi для всех входов в систему и т. Д. Это действительно крутой шаблон, если вы его еще не видели.
Я поместил весь свой код здесь: https://github.com/s093294/aspnet-identity-rtm/tree/master
(Обратите внимание, это только для вдохновения. Я только заставил это работать и больше ничего. У меня тоже есть ошибка или два).
Новая ссылка на ключевое слово из 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 необходимо для того, чтобы вы могли «переопределить» невиртуальные и статические методы.
Нет, на самом деле это не «новое» (простите за каламбур). В основном он используется для «сокрытия» метода. 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 (); Метод производного класса будет вызываться из-за полиморфизма.
Как объясняли другие, он используется для скрытия существующего метода. Это полезно для переопределения метода, который не является виртуальным в родительском классе.
Имейте в виду, что создание «нового» члена не является полиморфным. Если вы приведете объект к базовому типу, он не будет использовать член производного типа.
Если у вас есть базовый класс:
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.
Это означает, что метод заменяет метод с тем же именем, унаследованный от базового класса. В вашем случае у вас, вероятно, нет метода с таким именем в базовом классе, а это означает, что ключевое слово new совершенно излишне.
Из документации:
Если методу в производном классе предшествует ключевое слово new, метод определяется как независимый от метода в базовом классе.
Что на практике это означает:
Если вы наследуете от другого класса и у вас есть метод с той же сигнатурой, вы можете определить его как «новый», чтобы он не зависел от родительского класса. Это означает, что если у вас есть ссылка на «родительский» класс, эта реализация будет выполнена, если у вас есть ссылка на дочерний класс, тогда эта реализация будет выполнена.
Лично я стараюсь избегать ключевого слова «new» обычно это означает, что я неправильно понял иерархию классов, но бывают случаи, когда это может быть полезно. Одно место предназначено для управления версиями и обратной совместимости.
Там '
From MSDN :
Используйте модификатор new, чтобы явно скрыть член, унаследованный от базовый класс. Чтобы скрыть унаследованный член, объявите его в производном класс с тем же именем и измените его с помощью модификатора new.