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()方法。是否有这样的可行性,或者我是如何实现它的呢?
答案 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
成为冗余。具体取决于实现细节。