【问题标题】:Call again abstract inherited method from another class再次调用另一个类的抽象继承方法
【发布时间】:2017-08-11 06:30:59
【问题描述】:

我正在使用抽象工厂模式。我需要调用一个名为HelperClass 的抽象方法。

例如:我有两个抽象派生类。我创建ClassA,然后ClassA 调用TakeAction 方法。 TakeAction 方法需要创建另一个使用HelperClass 和调用class the methodSolveProblem 的方法。

这是我的问题:如何在HelperClass 中再次调用ClassA 方法?因为 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() {

    }
}

【问题讨论】:

  • 不确定您要解决什么问题。当您说“我怎样才能再次返回 ClassA 方法?”时,您是什么意思?
  • 工厂或抽象工厂是创建模式。您的实现看起来不像。它看起来更像是一个复杂的接口。为什么需要 HelperClass?有什么具体原因吗?
  • DavidN:我的意思是,如何在任何函数中调用调用者实例方法之一? MongZhu:是的,通常在main方法中,我会创建多个派生类。所以我决定使用抽象工厂。但是如果接口是更好的解决方案,我会打开它:) 我需要 Helper 类,因为它实际上管理场景。所以我想在一个类中处理所有场景操作。实际上我的 swicth 语句有 7 个 case,其中只有 2 个需要再次调用 caller 类方法。
  • 你从抽象类继承的东西已经像一个接口了。接口是一个完全抽象的类。 :) 您可以使用此继承通过多态性来解决您的问题。看看我的回答

标签: c# inheritance abstract-class abstract-factory


【解决方案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;
    }
}

ClassAbstractTakeAction 的基本实现中调用此方法时,您需要传递当前实例(this)来关闭圆圈:

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

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

通过polymorphism 的现象,将调用覆盖的正确实现。在您上面的示例中,它将覆盖 ClassA 类的 WeekEndOperationWeekDayOperation 方法

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多