Общий базовый класс - PullRequest
       40

Общий базовый класс

0 голосов
/ 02 июля 2019

Я выполняю настройку из существующей библиотеки, которая имеет следующую структуру:

public class BaseClass
{
    public Method1();
    public Method2();
}
public class A : BaseClass
{
    public Method1();
    public Method2();
}
public class B : BaseClass
{
    public Method1();
    public Method2();
}
public class C : BaseClass
{
    public Method1();
    public Method2();
}

Выше приведен код, который Я не могу изменить .

Сейчас,Мне нужно кончить A, B, C. Но ВСЕ изменения внутри каждого наследства абсолютно одинаковы.логика и код - абсолютно одинаковые изменения.

public class BaseClass1 : BaseClass
{
    public override Method1(); //some logic changed comparing to base
}
public class A1 : A
{
    public override Method1(); //Changes are totally  same with BaseClass1 
}
public class B1 : B
{
    public override Method1(); //Changes are totally  same with BaseClass1 
}
public class C1 : C
{
    public override Method1(); //Changes are totally  same with BaseClass1 
}

Весь код дублируется, копируется в каждый класс.

Мой вопрос: как можно избежать копирования кода ??

Этот код не работает четко:

public class BaseClass1<T> : T where T: BaseClass  //Base class cannot be T
{
    public override Method1(); 
    public override Method2(); 
}

Причина, по которой я не хочу дублировать код, состоит в том, что есть C, D, E, F и т. Д. Наследования.

1 Ответ

0 голосов
/ 02 июля 2019

В качестве одного из вариантов вы можете использовать вариант шаблона декоратора (точные сигнатуры библиотеки неизвестны, поэтому я добавил примеры, где методы переопределяются или скрываются). Пример ниже:

// original libary code
public class BaseClass
{
    public virtual string Method1() => "m1 of base";
    public string Method2() => "m2 of base";
}
public class A : BaseClass
{
    public override string Method1() => "m1 A";
    public string Method2() => "m2 A";
}
public class B : BaseClass
{
    public override string Method1() => "m1 B";
    public string Method2() => "m2 B";
}
public class C : BaseClass
{
    public override string Method1() => "m1 C";
    public string Method2() => "m2 C";
}


// methods to be overridden
public interface IMethodOfBase
{
    void Method1();
    void Method2();
}

// common behaviour
public class Decorator:IMethodOfBase
{
    private BaseClass b;

    public Decorator(BaseClass b)
    {
        this.b = b;
    }

    public void Method1()
    {
        Console.WriteLine($"overridden behaviour in one place {b.Method1()}");
    }

    public void Method2()
    {
        Console.WriteLine($"overridden behaviour in one place {b.Method2()}");
    }
}

// example usage
public class WorkLoad
{
    private List<Decorator> _work; 

    public WorkLoad()
    {
        _work = new List<Decorator>
        {
            new Decorator(new A()),
            new Decorator(new B()),
            new Decorator(new C()) //etc
        };
    }

    public void DoWork()
    {
        _work.ForEach( n =>
        {
            n.Method1();
            n.Method2();
        });
    }

}

и для запускаit

WorkLoad workLoad = new WorkLoad();
workLoad.DoWork();

и вывод: переопределенное поведение в одном месте m1 A

переопределенное поведение в одном месте m2 базы

переопределенное поведение в одном месте m1 B

переопределенное поведение в одном месте м2 базы

переопределенное поведение в одном месте m1 C

переопределенное поведение в одном месте м2 базы

...