Вы можете использовать ключевое слово "new" в вашем методе, чтобы "скрыть" метод, который не был объявлен как абстрактный / виртуальный, однако, если метод вызывается из переменной, приведенной к типу как базовый класс, он не будетназови свой новый метод.Это похоже на переопределение.
Пример:
public class A
{
public string GetName() { return "A"; }
}
public class B : A
{
// this method overrides the original
public new string GetName() { return "B"; }
}
Методы расширения позволяют добавлять новые методы в любой класс, даже если у вас нет их исходного кода или они запечатаны,Это не то же самое, что переопределение
public sealed class A // this could even be from a dll that you don't have source code to
{
}
public static class AExtensionMethods
{
// when AdditionalMethod gets called, it's as if it's from inside the class, and it
// has a reference to the object it was called from. However, you can't access
// private/protected fields.
public static string AdditionalMethod(this A instance)
{
return "asdf";
}
}
Другой вариант - использовать интерфейсы, чтобы вы могли иметь два совершенно разных объекта, каждый из которых имеет один и тот же метод, но при вызове из переменной, приведенной к типу в качестве интерфейса, это похоже на переопределение.
Вы также можете использовать форму фреймворка Proxy Mocking, такую как Microsoft Moles или CastleWindsor -> У них есть способ создания экземпляра «прокси» объекта, который имеет тот же интерфейс, что и реальныйобъект, но может обеспечить различную реализацию для каждого метода.