Как не прописывать одни и те же методы во всех классах, которые отличаются одной строкой?

Имеются 2 метода StatsUpdate() и ActionAdd(). Они используются в 3х классах и дальше будут использоваться примерно в 8 классах. Логика у них одинковая во всех классах. За исключение 1 строки

MyClass.Instanse.Actions = actions;

Различия только в том, в какой класс отдаются данные.

Хочется прописать его один раз, а не в каждом классе. Как сделать так, чтобы метод понимал куда отдавать данные? Есть вариант передавать в метод имя класса из которого он вызывается, и после через if else выбирать куда посылать данные. Но я думаю есть более изощренный способ это сделать


Ответы (1 шт):

Автор решения: A K

Отнаследуйтесь от базового класса.

Допустим у вас есть два класса:

public class Foo
{
    public void StatsUpdate()
    {
        // общие действия во всех классах
        Console.WriteLine("Welcome");
        
        // различающаяся одна строчка
        Console.WriteLine("Foo");
    }
}


public class Bar
{
    public void StatsUpdate()
    {
        // общие действия во всех классах
        Console.WriteLine("Welcome");

        // различающаяся одна строчка
        Console.WriteLine("Bar");
    }
}

Сделайте базовый:

public class FooBarBase
{
    protected void CommonLogic()
    {
        // общие действия во всех классах
        Console.WriteLine("Welcome");
    }
}

и наследников:

public class Foo : FooBarBase
{
    public void StatsUpdate()
    {
        CommonLogic();

        // различающаяся одна строчка
        Console.WriteLine("Foo");
    }
}


public class Bar : FooBarBase
{
    public void StatsUpdate()
    {
        CommonLogic();

        // различающаяся одна строчка
        Console.WriteLine("Bar");
    }
}

Эффект - тот же самый:

var foo = new Foo();
var bar = new Bar();

foo.StatsUpdate();
bar.StatsUpdate();

Ну а дальше по вкусу... можно передавать переменные в базовый метод, чтобы включать или выключать в нём логику, использовать проверки на тип наследника, например:

protected void CommonLogic()
{
    if(this.GetType() == typeof(Bar))
        Console.WriteLine("Foo logic");
        
    // общие действия во всех классах
    Console.WriteLine("Welcome");
}

ну и так далее.

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

→ Ссылка