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

本文关键字:方法 接口 参数 变参 何创建 创建 | 更新日期: 2023-09-27 17:57:45

我试图创建一个通用类的接口,但实现类可以有不同的参数。

例如

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) //...
}

请注意,我想对ResetReferences命名约定进行标准化。我很确定我做不到,但有一种设计模式可以奏效吗?例如,在我的界面中,如下所示?

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

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

也许接口用错了?也许只是一个基类和一些编码约定?

谢谢,

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

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

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

我应该补充一点,IMO,ResetReferences()不应该争论。。。它应该重置为特定于实现接口的单个类型的某个默认值"重置";对我来说,这个词的意思是";"恢复到初始状态";。。。添加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基类派生的),以便该对象封装动态特性,并且仍然允许接口是静态的。但在这一点上,你基本上是围绕着类型系统工作的。

相关文章: