2013-07-10 2 views
6

Наследует ли наследство от класса неиспользованные методы принципа разделения сегрегации?Принцип сегрегации наследования и интерфейса

Например:

abstract class Base 
{ 
    public void Receive(int n) 
    { 
     // . . . (some important work) 

     OnMsg(n.ToString()); 
    } 

    protected abstract void OnMsg(string msg); 
} 

class Concrete : Base 
{ 
    protected override void OnMsg(string msg) 
    { 
     Console.WriteLine("Msg: " + msg); 
    } 
} 

Concrete зависит от метода Base.Receive(int n), но он никогда не использует его.

UPD

Определение Я использую:

ISP утверждает, что ни один клиент не должен быть вынужден зависеть от методов его не использует.

+0

Я не уверен, что в этом примере, что он не использует его, как бы OnMsg никогда не будет вызываться, если получает не используется? – BlackICE

+0

В моем случае единственный способ вызвать 'OnMsg' - от' Receive'. Мне нужно наследование для ввода входящих данных ('int n') в интерфейс' Concrete', который использует 'string msg'. В реальном примере есть более сложная работа, чем просто 'ToString()' – astef

+0

@astef: Как правильно указал Пауло, вы используете шаблон шаблона шаблона здесь :) –

ответ

7

Я думаю, что вы неверно истолковываете то, что говорит принцип разделения сегрегации. В вашем случае вы в порядке и не «заставляете» какую-либо реализацию. На самом деле вы претендуете на Template method design pattern

Если у вас гипотетический

interface ICommunicateInt 
{ 
    int Receive(); 
    void Send(int n); 
} 

для того, чтобы реализовать его, ваш Base класс будет вынужден реализовать Send метод, который ему не нужно. Таким образом, провайдер предлагает, что лучше иметь:

interface ISendInt 
{ 
    void Send(int n); 
} 

interface IReceiveInt 
{ 
    int Receive(); 
} 

так что классы могут выбрать для реализации одного или обоих. Также методы в других классах, которые нуждаются в классе, который может послать Int, могут потребовать

void Test(ISendInt snd) 
// void Test(ICommunicateInt snd) // Test would "force" snd to depend on 
            // a method that it does not use 
0

Я не вижу, что конкретный «зависит» от Base.Receive() в том, как я буду использовать этот термин. Как Бетон должен измениться, если Получатель был изменен? Я бы сказал, совсем нет. Предположим, мы заменили Receive() на метод другого имени или с другой подписью, Concrete не знал бы. Получает ли вызов Concrete()? Нет. Поэтому я не вижу зависимости от Receive() здесь.

Зависимость с подписью OnMsg(), Concrete участвует в очень специфических отношениях с базой, выполняя этот контракт OnMsg().

Но в другом смысле Concrete очень сильно зависит от Base.Receive(), который является интерфейсом к внешнему миру - без этого метода никто не может получить доступ к элементам Concrete. В этом смысле Concrete «использует» Base.Receive() на очень фундаментальном уровне.

+0

Я вас понимаю. Но в чем же ответ? Неужели это плохой способ проецировать неизвестные входящие данные на целевой интерфейс? – astef

+0

Нет, это не плохо, это принципиально важный образец. – djna

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