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

Ray*_*ond 15 .net c# methods interface

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

例如

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) //...
}
Run Code Online (Sandbox Code Playgroud)

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

// variable parameters
void ResetReferences(params object[] list); 
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,

Jef*_*hol 23

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

public interface IViewModel
{
    //...
    void ResetReferences(IResetValues vals); 
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Raymond:如果你喜欢这个答案,请投票并给 JeffSahol 多 10 点声誉。人们喜欢一句“谢谢”的评论,但在追求声誉的过程中,一句评论是无济于事的。 (3认同)

And*_*bel 17

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

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


Jon*_*eet 15

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

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

public interface IViewModel<T>
{
    void ResetReferences(T data);
}
Run Code Online (Sandbox Code Playgroud)

然后你将它封装List<Color> colors, List<Size> sizes成一种类型,并可能放入List<StateProvinces> stateProvinces另一种类型.

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