如何创建具有可变参数/不同方法签名的方法接口
本文关键字:方法 接口 参数 变参 何创建 创建 | 更新日期: 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基类派生的),以便该对象封装动态特性,并且仍然允许接口是静态的。但在这一点上,你基本上是围绕着类型系统工作的。