Снова вызовите абстрактный унаследованный метод из другого класса

Я использую абстрактный заводской шаблон. Мне нужно вызвать абстрактный метод, который называется HelperClass.

Например: у меня есть два абстрактных производных класса. Я создаю ClassA, затем ClassA вызывает метод TakeAction. TakeAction необходимо создать другой метод, который использует HelperClass и callclass the methodSolveProblem`.

Вот мой вопрос: как я могу снова вызвать метод ClassA в HelperClass? Потому что SolveProblem имеет некоторую логику и будет решать возвращаться или нет.

class Program {
    static void Main(string[] args) {
        var classA = new ClassA();
        classA.StartOperation();
    }
}

public abstract class ClassAbstract {
    public abstract void StartOperation();

    public void TakeAction() {
        var helper = new HelperClass();
        helper.SolveProblem(DayOfWeek.Sunday);
    }

    public abstract void WeekDayOperation();
    public abstract void WeekEndOperation();
}

public class ClassA : ClassAbstract {
    public override void StartOperation() {
        TakeAction();
    }

    public override void WeekDayOperation() {
    }

    public override void WeekEndOperation() {
        throw new NotImplementedException();
    }
}

public class ClassB : ClassAbstract {
    public override void StartOperation() {
        TakeAction();
    }

    public override void WeekDayOperation() {
    }

    public override void WeekEndOperation() {
        throw new NotImplementedException();
    }
}

public class HelperClass {
        public void SolveProblem(DayOfWeek day) {
        //Problem solved. I need to call "CallThisMethod" who called this helper class
        //How to I Call
        switch(day) {
            case DayOfWeek.Sunday:
            case DayOfWeek.Saturday:
                ClassA.WeekEndOperation();
                break;
            case DayOfWeek.Friday:
                FridayOperations();
                break;
            default:
                ClassA.WeekDayOperation();
                break;
        }
    }

    public void FridayOperations() {

    }
}

person is_oz    schedule 11.08.2017    source источник
comment
Не уверен, какую проблему вы пытаетесь решить. Что вы имеете в виду, когда говорите, как я могу снова вернуть методы ClassA?   -  person DavidN    schedule 11.08.2017
comment
фабрика или абстрактная фабрика — это созидательные паттерны. Ваша реализация не похожа на это. Это больше похоже на запутанный интерфейс. Зачем вам нужен HelperClass? есть конкретная причина?   -  person Mong Zhu    schedule 11.08.2017
comment
DavidN: Я хочу сказать, как я могу вызвать этот один из методов экземпляра вызывающего объекта в любой функции? MongZhu: да, обычно в основном методе я создаю несколько производных классов. Поэтому я решил использовать абстрактную фабрику. Но если интерфейс - лучшее решение, я его открываю :) Мне нужен класс Helper, потому что он фактически управляет сценариями. Итак, я хочу обрабатывать все операции сценария в классе. На самом деле мой оператор swith имеет 7 случаев, и только 2 из них нужно снова вызвать, вызывающий метод класса.   -  person is_oz    schedule 11.08.2017
comment
ваше наследование от абстрактного класса уже похоже на интерфейс. Интерфейс — это полностью абстрактный класс. :) вы можете использовать это наследование для решения вашей проблемы с помощью полиморфизма. Посмотрите на мой ответ   -  person Mong Zhu    schedule 11.08.2017


Ответы (1)


Одним из решений было бы передать экземпляр типа: ClassAbstract в качестве параметра в метод SolveProblem. Затем вы можете использовать эту переменную для вызова метода.

public void SolveProblem(DayOfWeek day, ClassAbstract c)
{
    //Problem solved. I need to call "CallThisMethod" who called this helper class
    //How to I Call
    switch (day)
    {
        case DayOfWeek.Sunday:
        case DayOfWeek.Saturday:
            c.WeekEndOperation();
            break;
        case DayOfWeek.Friday:
            FridayOperations();
            break;
        default:
            c.WeekDayOperation();
            break;
    }
}

Чтобы замкнуть круг, вам нужно передать текущий экземпляр (this) при вызове этого метода в базовой реализации TakeAction в ClassAbstract:

public abstract class ClassAbstract
{
    public abstract void StartOperation();

    public void TakeAction()
    {
        var helper = new HelperClass();
        helper.SolveProblem(DayOfWeek.Sunday, this);
    }

Явлением полиморфизма будет вызвана правильная реализация переопределения. В приведенном выше примере это будут переопределения методов WeekEndOperation и WeekDayOperation класса ClassA.

person Mong Zhu    schedule 11.08.2017