接口方法(定义)依赖于在同一接口中定义的另一个方法(定义)

时间:2016-11-02 11:47:39

标签: c# methods interface strategy-pattern

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()方法。是否有这样的可行性,或者我是如何实现它的呢?

1 个答案:

答案 0 :(得分:2)

您正在寻找的是抽象类。

接口只保存一个类应该保存的API的信息 - 而不是它附带的逻辑。

如果你想要逻辑ontop,你有几个选项 - 例如:

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();} }
}

如果ABSAdavanced是公共API的一部分,则会再次使isABSEnabled成为冗余。具体取决于实现细节。