如何使用可变参数/不同方法签名创建方法接口?

时间:2011-05-24 17:37:20

标签: c# .net interface methods

我正在尝试创建一个公共类的接口,但实现类可以有不同的参数。

e.g。

public interface IViewModel
{
    //...
    void ResetReferences(); 
}

// and then, in my class implementations, something like this:
public class LocationViewModel : IViewModel
{
    public void ResetReferences(List<StateProvinces> stateProvinces) //...
}

public class ProductViewModel : IViewModel
{
    public void ResetReferences(List<Color> colors, List<Size> sizes) //...
}

请注意,我希望标准化“RestReferences”命名约定。我很确定我不能这样做,但是有没有可行的设计模式?例如在我的界面中,如下所示?

// variable parameters
void ResetReferences(params object[] list); 

但是,如何让我进行类型检查或让它调用我想要的实际方法签名等?

使用界面可能是错误的?也许只是一个基类和一些编码约定?

谢谢,

5 个答案:

答案 0 :(得分:23)

用实现相关接口的对象替换你的args列表:

public interface IViewModel
{
    //...
    void ResetReferences(IResetValues vals); 
}

我应该补充一点,IMO,“ResetReferences()”不应该采用参数......它应该重置为某个默认值,该默认值将特定于实现您的接口的各个类型...“重置“对我而言,这意味着”恢复到初始状态“......添加args意味着你可以控制它。

答案 1 :(得分:16)

接口的目的是让客户端代码了解接口并忽略实现。如果您的实现在调用时需要特殊处理,那么客户端代码需要知道它调用的实现,然后接口的整个目的都将丢失。

除非我完全误解了你想要完成的事情,否则你就走错了路。

答案 2 :(得分:12)

如果参数可能不同,那么它实际上并不是一个通用的接口。这样说:调用者需要知道实现类吗?如果是这样,你就失去了接口的松散耦合优势。

一种选择是将参数封装到另一种类型中,并使该类在该类型上具有通用性。例如:

public interface IViewModel<T>
{
    void ResetReferences(T data);
}

然后你将List<Color> colors, List<Size> sizes封装成一种类型,并可能将List<StateProvinces> stateProvinces封装在另一种类型中。

虽然有点尴尬......

答案 3 :(得分:0)

您需要实现接口方法,但仍然可以执行您想要的操作

public class LocationViewModel : IViewModel
{
    public void ResetReferences(List<StateProvinces> stateProvinces) // ...

    void IViewModel.ResetReferences() // ...
}

答案 4 :(得分:0)

你必须在接口中有两个方法(并且一个方法不正确,一个实例抛出一个不支持的异常),或者让接口从另外两个接口继承到相同的效果。

接口定义是整个签名。

也可以将对象作为参数传递(可能从ParameterProvider基类派生),以便对象封装动态特性并仍然允许接口是静态的。但那就是说,无论如何,你基本上都在使用类型系统。