C# 接口方法(定义)依赖于同一接口中定义的另一种方法(定义)

C# 接口方法(定义)依赖于同一接口中定义的另一种方法(定义),c#,methods,interface,strategy-pattern,C#,Methods,Interface,Strategy Pattern,在上面的例子中,我已经实现了策略模式。我的问题是,我有不同的汽车类实现了ICar接口。只有当方法IsABSEnabled()返回true时,才能调用方法IsABSAdvanced(),否则它应该返回false。因此,如何使一个接口方法(定义)依赖于同一接口中定义的另一个方法(定义)?有没有办法将限制限制限制在接口级别,这样任何访问isasadvanced()的人都不应该知道它实际上在内部检查了isasenabled()方法。有这样的可行性吗?或者我怎样才能实现它?您要找的是抽象类 接口只保存关于

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

您要找的是抽象类

接口只保存关于类应该保存的API的信息,而不是它附带的逻辑

如果您想要它的逻辑ontop,您有几个选项-一个,例如:

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();
然后所有的汽车都扩展了
AbstractCar
——因为
AbstractCar
是一个抽象类,所以它不能被实例化为一个对象

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

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

如果根据实现细节,
isassenabled
是公共API的一部分,那么它又会使
ABSAdavanced
变得多余。

您要查找的是抽象类

接口只保存关于类应该保存的API的信息,而不是它附带的逻辑

如果您想要它的逻辑ontop,您有几个选项-一个,例如:

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();
然后所有的汽车都扩展了
AbstractCar
——因为
AbstractCar
是一个抽象类,所以它不能被实例化为一个对象

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

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

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

您是否考虑过在接口和具体类之间添加一个抽象类来处理这个问题?最好在代码审查时询问,而不是在这里。您是否考虑过添加一个抽象类在您的接口和具体类之间的抽象类来处理这个问题?最好在代码审查时询问,而不是在这里。