【问题标题】:interface method (definition) dependent on another method (definition) defined in same interface接口方法(定义)依赖于同一接口中定义的另一个方法(定义)
【发布时间】:2016-11-02 11:47:39
【问题描述】:
public interface ICar
{
    bool IsSpeeds200KMPH(CarData carData);
    bool IsABSEnabled(CarData carData);
    int doors {get;set;}
    int wheels {get;set;}
    bool IsABSAdvanced();
    bool IsSpeedReaches225();
    void drive(CarType car);
}

public class BMW : ICar
{
}

public class Honda : ICar
{
}

// factory class to create car object dynamically
public class CarFactory
{
    public ICar CreateCar(CarType car)
    {
        if(car == TypesOfCars.Honda)
            return new Honda;
        else if(car == TypesOfCars.BMW)
            return new BMW;
        //....
    }
}


//main() method snippet
CarFactory factory = new CarFactory();
ICar carType = facory.CreateCar(DynamicallyProvided_CarTypeValue);
carType.IsABSEnabled(DynamicallyProvided_carData);
carType.IsABSAdvanced();

在上面的例子中,我实现了策略模式。我的问题是,我有不同的 Car 类实现 ICar 接口。只有当方法 IsABSEnabled() 返回 true 时,才能调用方法 IsABSAdvanced(),否则只能返回 false。因此,如何使一个接口方法(定义)依赖于同一接口中定义的另一种方法(定义)?有没有办法限制接口级别的限制,这样访问 IsABSAdvanced() 的任何人都不知道它实际上在内部检查 IsABSEnabled() 方法。有没有这样的可行性或者我如何才能实现它?

【问题讨论】:

  • 你有没有考虑在你的接口和具体类之间添加一个抽象类来处理这个问题?
  • 最好在 Code Review 上而不是在这里问。

标签: c# methods interface strategy-pattern


【解决方案1】:

您正在寻找的是抽象类。

接口仅包含有关类应包含的 API 的信息 - 而不是它附带的逻辑。

如果您想在其上添加逻辑,您有几种选择 - 例如,一种:

public interface ICar
{
    bool IsSpeeds200KMPH(CarData carData);
    bool IsABSEnabled(CarData carData);
    int doors {get;set;}
    int wheels {get;set;}
    bool ABSAdvanced{get;};
    bool IsSpeedReaches225();
    void drive(CarType car);
}

public abstract class AbstractCar : ICar {
    public bool ABSAdvanced {
        get {
            if(!isABSEnabled()) {
                return false;
            }
            /* some additional logic based on the interface */
            /* ... */
            return true;
        }
    }
}

然后所有汽车都扩展AbstractCar - 因为AbstractCar 是一个抽象类,它不能被实例化为一个对象。

您的问题也可以通过以下方式简化:

public abstract class AbstractCar : ICar {
    public bool ABSAdvanced { get {return isAbsEnabled();} }
}

如果 isABSEnabled 是公共 API 的一部分,这又使 ABSAdavanced 变得多余,具体取决于实现细节。

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 2010-09-19
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多