Как я могу сделать подклассы для переопределения метода с частичной реализацией? - PullRequest
0 голосов
/ 14 июля 2020

Я хотел бы обязать все подклассы моего класса переопределить метод, но я хочу дать базовую c реализацию этому методу. Я знаю, что это звучит немного странно, поэтому вот объяснение: у меня есть большая база кода (C#), в которой используется абстрактный метод. каждый подкласс переопределяет этот метод и имеет свои особые потребности от этого метода. До сих пор я добавил явный метод с частичной реализацией в базовый класс, и я переопределил абстрактный метод и вызвал явный метод во всех подклассах. Таким образом я могу избежать дублирования кода и по-прежнему поддерживать «особые потребности» каждого подкласса. Мне это решение кажется довольно запутанным. Может кто-нибудь познакомить меня с лучшим решением?

абстрактный пример:

class base{
    method abstract count()
}

class A:base{
    method override count(){
        count()
        print('A')
    }
}

class B:base{
    method override count(){
        count()
        print('B')
    }
}

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Вот как бы я это сделал:

Создайте publi c метод с именем Count в BaseClass. Этот метод должен вызывать метод реализации базового счетчика, а затем метод абстрактного счетчика. отметьте, что абстрактный метод подсчета защищен.

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

Вот основная c структура кода:

abstract class Base
{
    public void Count()
    {
        CountBaseImplementation();
        CountSubClassesImplementation();
    }

    private CountBaseImplementation() 
    {
        // Base implementation here
    }

    protected abstract CountSubClassesImplementation();
}

class A : Base
{
    protected override CountSubClassesImplementation()
    {
        // A specific implementation here
    }
}

class B : Base
{
    protected override CountSubClassesImplementation()
    {
        // B specific implementation here
    }
}
0 голосов
/ 14 июля 2020

Вызов base.count() для вызова метода count базового класса.

Изменить: я перечитал ваше решение и теперь не уверен, что вы уже делаете это. Можно разложить метод на несколько разных методов, некоторые из которых можно переопределить. Например count() => countApples() + countOranges() - wormMultiplier() *countWorms();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...