Intereting Posts
Структурирование структуры со встроенным указателем от C # до неуправляемого драйвера ExpectedException в nUnit дал мне ошибку C #: Как бы вы объединили тест GetHashCode? Функция String.Split () загадочно игнорирует дубликаты давая экземпляру classа имя переменной API отслеживания изменений структуры Entity Framework и справочные записи распаковать ZIP-файл на windowsх 8 C # Проблемы с развертыванием приложения ASP.NET 5 (ASP.NET Core) для Azure Заменить слово из определенной строки в текстовом файле Прокси-сервер, созданный WCF, не содержит * Указанные флаги свойств для строковых полей WSDL с minoccurs = “0” Идеи о том, как отображать самомоднейшее окно сообщения как подсказку Как вы получаете значение свойства из PropertyInfo? Содержит ли PowerShell скрипты? Десерлизация свойств без учета регистра Json.NET Отправить частичную модель представления и обновить частичное представление с jQuery имеет проблемы

Автоматически вызывать базовый метод

Мне нужно вызвать метод базового classа при вызове overriden one (например, база вызовов конструкторов). Например:

class A { public void Fun() { Console.Write("Class A!"); } } class B : A { public void Fun() { Console.Write("Class B!"); } } 

Я хочу посмотреть на экране

Класс A! Класс B!

при выполнении следующего кода:

 B b = new B(); b.Fun(); 

Может ли кто-нибудь сказать мне, пожалуйста, что нужно изменить в примере кода или как лучше писать, чтобы получить требуемый результат? Благодарю.

Если вы не хотите явно вызывать его и, следовательно, убедитесь, A.Fun() в производном classе A.Fun() , вы можете использовать что-то, называемое шаблоном метода шаблона :

 class A { public void Fun() { Console.Write("Class A!"); FunProtected(); } protected virtual void FunProtected() { } } class B : A { protected override void FunProtected() { Console.Write("Class B!"); } } 

Это даст вам:

 new A().Fun() -> "Class A!" new B().Fun() -> "Class A! Class B!" 

Если вы хотите такого поведения, вам нужно будет изменить платформу / язык. .NET не автоматически вызывает базовый метод. Вы должны вызвать это явно. Также ваш метод должен быть виртуальным или вы будете скрывать его в производном classе:

 class A { public virtual void Fun() { Console.Write("Class A!"); } } class B : A { public override void Fun() { // call the base method which will print Class A! base.Fun(); Console.Write("Class B!"); } } 

Теперь, когда вы это сделаете:

 B b = new B(); b.Fun(); 

вы получите требуемый результат.

Может быть так:

 interface IFun { void Fun(); } abstract class A : IFun { void IFun.Fun() { Console.Write("Class A!"); Fun(); } protected abstract void Fun(); } class B : A { protected override void Fun() { Console.Write("Class B!"); } } IFun b = new B(); b.Fun(); 

Это работает, если ссылкой на объект является IFun.

Для справки вы можете использовать шаблон оболочки, который помещает A внутри B. Вот грубый пример!

 interface IFunClass { void Fun(); } class A : IFunClass { public void IFunClass.Fun() { Console.Write("Class A!"); } } class B : IFunClass { public B(IFunClass f) { this.m_SomethingFun = f; } public void IFunClass.Fun() { this.m_SomethingFun.Fun(); Console.Write("Class B!"); } private IFunClass m_SomethingFun; } A a = new A(); B b = new B(a); b.Fun() // will call a.Fun() first inside b.Fun()