интерфейс и наследование - PullRequest
1 голос
/ 13 мая 2011

C #, VS 2008 У меня есть 4 случая, скажем, a, b, c, d, я планирую разделить их и создать отдельные классы, в 4 случаях есть что-то общее, я помещаю их в интерфейс и создаю базовый класс, который реализуетинтерфейс.теперь между a & b, a & c, c & d есть что-то общее, не знаю, как сделать хороший / чистый инструмент

спасибо

Ответы [ 4 ]

2 голосов
/ 13 мая 2011

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

Выделите общие части для вспомогательных классов, которые вы используете из различных реализаций a, b, c и d.

Это возможно только в том случае, если реализация не тесно связана с частными данными каждого класса.

2 голосов
/ 13 мая 2011

Как правило, наследование следует использовать только в том случае, если ваши объекты относятся к одному и тому же объекту.Если это так, то вы можете использовать наследование для совместного использования реализации, которая присуща определению базового объекта.

Если классы a, b, c и d на самом деле не являются разными видами одного и того же объекта, товы можете попытаться инкапсулировать их общие функциональные возможности во внутренний объект, на который ссылаются.

public class a
{
    private CommonFunctionalityClass commonFunc;

    public a()
    {
        this.commonFunc = new CommonFunctionalityClass();
    }
} 

Когда вы хотите выполнить обычные вещи, вы просто вызываете свой экземпляр commonFunc.Вы можете сделать ту же инкапсуляцию для a / b, b / c и c / d, где вы делитесь функциональностью через a, имеет отношение, используя объект с внутренней ссылкой.Таким образом, вы не дублируете код, но можете гибко делиться функциональностью.

2 голосов
/ 13 мая 2011

Есть несколько вариантов.

Вы можете иметь c и d наследовать от a, а d наследовать от c.Вы можете создать базовый класс для каждой пары a / b, a / c и c / d.Вы можете дублировать функциональность.Вы можете предоставить функциональность с помощью вспомогательного класса (статические методы могут быть опцией).

Это действительно зависит от того, какая функциональность используется совместно, и предполагаемого использования классов.

1 голос
/ 13 мая 2011
public interface IABInterface
{
    //Whatever is common to A and B. It will have to be implemented in the classes
}

public interface IACInterface
{
    //Whatever is common to A and C. It will have to be implemented in the classes
}

public interface ICDInterface
{
    //Whatever is common to C and D. It will have to be implemented in the classes
}

public class ABCDBase
{
    //Whatever is common to all classes
}

public class A : ABCDBase, IABInterface, IACInterface
{
}

public class B : ABCDBase, IABInterface
{
}

public class C : ABCDBase, IACInterface, ICDInterface
{
}

public class D : ABCDBase, ICDInterface
{
}

Вы можете позже создать методы расширения статического класса для ваших интерфейсов, чтобы не дублировать код для ваших методов в реализациях интерфейсов (Другими словами, не определяйте методы в ваших интерфейсах, только свойства).С помощью рефакторинга может быть действительно легко реализовать свойства в ваших интерфейсах.Было бы неплохо иметь свойства расширения.Надеюсь, в будущем.

РЕДАКТИРОВАТЬ

Как это:

public static class Helper
{
    public static void IABMethod1(this IABInterface aOrBObject, arguments args)
    {
        //This will be available for any A or B object without duplicating any code
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...