В чем было бы преимущество интерфейса, который подразумевает определенную реализацию?

#asp.net #ajax #callback #class-design #interface-design

#asp.net #ajax #обратный вызов #дизайн класса #интерфейс-дизайн

Вопрос:

Я смотрю на это:

 public interface IAjaxCallbackEventHandler : ICallbackEventHandler
    {
        string CallbackResponse { get; set; } 
    }
}
  

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

 public partial class XPage : Page, IAjaxCallbackEventHandler {
    // public because it's an interface, but really an implementation detail ;-(
    public string CallbackResponse { get; set; }

    // implementing underlying ICallbackEventHandler interface
    public void RaiseCallbackEvent(string eventArgument)
    {
        try
        {
            CallbackResponse = SomeOperation(eventArgument);
        }
        catch (Exception ex)
        {
            CallbackResponse = ex.ToString();
        }
    }

    // implementing underlying ICallbackEventHandler interface
    public string GetCallbackResult()
    {
        return CallbackResponse;
    }

}
  

Насколько я могу судить, этот интерфейс просто гарантирует, что программисту придется подумать о сохранении ответа от RaiseCallbackEvent , чтобы позже быть возвращенным из вызова в GetCallbackResult .

Я не вижу никаких реальных преимуществ в этой технике, поскольку вам уже нужно реализовать и подумать о двух методах, которые это делают.

Ваши мысли — есть ли какие-либо действительные преимущества в этом подходе, или это просто запах кода?

Ответ №1:

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

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