如何创建具有可变参数/不同方法签名的方法接口?

问题描述

| 我正在尝试创建一个通用类的接口,但是实现类可以具有不同的参数。 例如
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); 
但是,如何使我进行类型检查或让它调用我想要的实际方法签名等? 也许接口是使用错误的东西?也许只是一个基类和一些编码约定? 谢谢,     

解决方法

将args列表替换为实现相关接口的对象:
public interface IViewModel
{
    //...
    void ResetReferences(IResetValues vals); 
}
我应该补充一点,IMO,\“ ResetReferences()\”不应带有参数...它应该重置为某些默认值,该默认值将特定于实现您的接口的单个​​类型... \“ Reset “”这个词对我来说意味着“恢复到初始状态” ...添加args意味着您可以控制它。     ,接口的目的是让客户端代码了解该接口,并且不考虑实现。如果您的实现在调用时需要特殊处理,则客户端代码需要知道其正在调用的实现,然后失去接口的全部用途。 除非我完全误解了您要完成的工作,否则您走错了路。     ,如果参数可以不同,那么它实际上不是通用接口。这样说:调用者是否需要知道实现类?如果是这样,您将失去接口的宽松耦合优势。 一种选择是将参数封装为另一种类型,并使该类对该类型通用。例如:
public interface IViewModel<T>
{
    void ResetReferences(T data);
}
然后,您将
List<Color> colors,List<Size> sizes
封装为一种类型,并可能将
List<StateProvinces> stateProvinces
放入另一种类型。 虽然有点尴尬...     ,您将需要实现接口方法,但是您仍然可以执行所需的操作
public class LocationViewModel : IViewModel
{
    public void ResetReferences(List<StateProvinces> stateProvinces) // ...

    void IViewModel.ResetReferences() // ...
}
    ,您可能必须在接口中同时使用这两种方法(并且对于一个实例不正确的方法会抛出不支持的异常),或者使该接口从其他两个接口继承以达到相同的效果。 接口定义是整个签名。 也有可能将对象作为参数传递(也许派生自ParameterProvider基类),以便该对象封装动态性质并仍允许接口为静态。到那时,无论如何,您基本上都在处理类型系统。