0

У меня есть 2 класса, которые имеют тот же логический/рабочий процесс, за исключением одного метода.C# OO Design: case, когда нужен только ОДИН абстрактный метод

Итак, я создал абстрактный базовый класс, где метод, который отличается, объявлен как абстрактный.

Ниже приведен пример кода для демонстрации моего дизайна; кто может предложить предложения по лучшему подходу или я направляюсь в правильном направлении. Я не использовал интерфейс, потому что оба производных класса B и C буквально разделяют большую часть логики. Есть ли лучший способ сделать то, что я делаю ниже, через инъекцию зависимости?

public abstract class A 
{ 
    public void StageData() 
    { 
     // some logic 
     DoSomething(); 
    } 
    public void TransformData(); 
    public abstract DoSomething(); 
} 

public class B : A 
{ 
    public override void DoSomething() 
    { 
     // Do Something! 
    } 
} 

public class C : A 
{ 
    public override void DoSomething() 
    { 
     // Do Something! 
    } 
} 
+1

Несомненно, это один из способов реализации совместного использования C#/Java (другой - состав/прокси). Однако только потому, что оба класса имеют общий предок, это не означает, что интерфейсы не являются полезными - они значительно облегчают заглушку и/или используют DI и/или полностью заменяют и т. Д. –

+0

(Я полюбил интерфейсы, потому что они разрешить такое разделение класса/реализации: если бы я создавал новый язык, я бы, скорее всего, * только * разрешал типы, задаваемые «интерфейсом», и поощрял специализацию интерфейса.) –

+0

Да, я предпочитаю использовать интерфейсы также для большую часть, но как вы справляетесь или уменьшаете дублируемую логику кода? – Abe

ответ

3

Нет ничего плохого в том, что вы сделали. Для того, чтобы ввести инъекции зависимостей в этой конструкции будет грязным и излишним - вы должны передать в качестве делегата:

public class ABC 
{ 
    public ABC(Action z) 
    { 
     _doSomethingAction = z; 
    } 

    public void DoSomething() 
    { 
     _doSomthingAction.Invoke(); 
    } 


    private Action _doSomthingAction; 
} 

Там будет несколько причин, почему вы хотите использовать этот подход - один будет, если вам необходимо выполнить обратный вызов. Поэтому придерживайтесь шаблона, который у вас есть, не пытайтесь перекомплементировать вещи.

+0

Отличная точка! Я хочу, чтобы вещи были максимально простыми. Я думаю, что использование интерфейсов и DI очень полезно, но определенно было бы излишним в этом конкретном случае. – Abe

+0

DI хорош, но в этом случае нет зависимости - 'DoSomething()' ничего не требует, это просто другая реализация одной и той же функциональности. – slugster

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