Nano Hash - криптовалюты, майнинг, программирование

Создание абстрактных методов, когда только часть метода одинакова во всех классах

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

Один метод, который я вижу в каждом классе, — это метод с именем MethodFoo(). Этот метод имеет общее тело, но каждый класс добавил к нему что-то БОЛЬШЕ... так, например, для одного класса это выглядит так:

private method MethodFoo()
{

   // common stuff ...// wow! a Goto Statement ..seriously!  //1

   **// NON-common stuff just for the method of this class**  //2

   Goto: // bunch of COMMON stuff again   //3
}

так что шаблон, как всегда, части 1 и 3 одинаковы для этого метода в разных классах, НО то, что отличается для него в каждом классе, - это часть 2 ... и также не забывайте об этом уродливом операторе goto :)

Итак, имея в виду эту картинку, как вы думаете, есть ли способ поместить часть этого в мой абстрактный класс?

06.09.2012

Ответы:


1

В вашем базовом классе:

private method MethodFoo()
{

   // common stuff ...// wow! a Goto Statement ..seriously!  //1

   DoExtraStuff();

   Goto: // bunch of COMMON stuff again   //3
}

protected abstract void DoExtraStuff();

Таким образом, вы должны реализовать DoExtraStuff во всех ваших наследуемых классах.

Этот шаблон известен как Шаблон проектирования "Метод шаблона".

06.09.2012

2

Вы описываете шаблон метода шаблона.

Разработчики обрабатывают DetailStep, но ToDo являются общими для всех.

public abstract class Parent
{
    public void ToDo()
    {
        Pre();

        DetailStep();

        Post();
    }

    protected abstract void DetailStep();
}
06.09.2012

3

Это можно решить с помощью шаблона «Метод шаблона». См. «Форму А» здесь:

Соглашение об именах для невиртуальных и абстрактных методов

Вы можете реорганизовать все MethodFoo, чтобы «подтянуть» общие вещи в базовый класс. Добавьте в базовый класс метод «защищенный виртуальный MethodFooInternal» (аналогичный «WalkInternal» в примере выше). Производные классы будут реализовывать свои необычные вещи в MethodFooInternal.

Чтобы исключить GOTO, вы можете создать условную логику в базовом классе, чтобы решить, вызывать ли метод MethodFooInternal или нет.

private method MethodFoo()
{

   // common stuff ...// wow! no more Goto Statement   //1

    if (this.needToExecuteNonCommonStuff()) {
       **// NON-common stuff just for the method of this class**  //2
        MethodFooInternal();
    }

   // bunch of COMMON stuff again   //3
}

protected abstract void MethodFooInternal();
}
06.09.2012

4

Сделайте его защищенным методом, и ваш производный класс сможет переопределить его и вызвать базовую реализацию:

protected override void MethodFoo()
{

  base.MethodFood();

   **// NON-common stuff just for the method of this class**  //2
}

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

06.09.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..