2015-06-04 4 views
3

Если я создаю метод с свойством «переопределить», производный метод автоматически не будет вызывать реализацию базового метода, и мне нужно будет называть его вручную, используя ключевое слово «base» следующим образом:Принудительный метод для вызова базового метода из базового класса

public class A 
{ 
    public virtual void Say() 
    { 
     Console.Write("A"); 
    } 
} 

public class B : A 
{ 
    public override void Say() 
    { 
     base.Say(); 
     Console.Write("B"); 
    } 
} 

Итак, только в этом случае строки «A» и «B» будут записаны на консоль. Итак, вопрос в том, как я могу избавиться от «base.Say()»; линия? Поэтому я хочу, чтобы каждый производный метод «Say» вызывал базовый метод из базового класса. Является ли это возможным? Я ищу любые решения, даже если я буду вынужден использовать другие ключевые слова.

+0

Это запах проблемы X-Y; вопрос о предлагаемом решении для неопределенной проблемы. Какое истинное деловое требование побуждает вас сделать этот запрос? –

+1

Короткий ответ: нет. Это невозможно в том, как вы это описываете. – sstan

+0

Я спрашиваю об этом вопросе в общем случае, у меня было много случаев, в которых использовалась эта функция. – Eugen1344

ответ

8

Хотя этого невозможно достичь напрямую, вы можете получить такой же эффект, написав собственный метод, который является не виртуальным, что называет виртуальный после выполнения некоторой фиксированной операции:

public class A 
{ 
    public void Say() 
    { 
     Console.Write("A"); 
     SayImpl(); 
    } 
    protected virtual void SayImpl() 
    { 
     // Do not write anything here: 
     // for the base class the writing is done in Say() 
    } 
} 

public class B : A 
{ 
    protected override void SayImpl() 
    { 
     Console.Write("B"); 
    } 
} 

Теперь любой класс наследует от A и реализации SayImpl() бы A предваряется его распечатке.

+0

Спасибо! Но мне любопытно, почему разработчики C# не добавили функции для переопределения mathod с реализацией? Это очень хорошая функция, я ее требую много раз – Eugen1344

+4

@ Eugen1344: Это именно то, что уже поддерживает C#. Теперь, автоматически вызывая метод базового класса также как часть переопределения, это совсем другая история. И тогда вам придется подумать, что не все разработчики хотят, чтобы это было готово. Кроме того, что, если вы хотите, чтобы вызов базового метода выполнялся ПОСЛЕ, а не ПЕРЕД переопределением. Или как насчет посередине, или на основе условия. Сохранение его явным является лучшим и наиболее гибким вариантом. – sstan

+2

Если вам это требуется много раз, у вас есть интересный набор требований. Мне очень редко приходится диктовать, как вызывающие вызовы ссылаются на базовые методы. Кроме того, такт, что есть такое легкое обходное решение, - отличная причина не создавать для него особую функцию. Особенности стоят денег. –

Смежные вопросы