问题描述
|
我正在尝试创建一个通用类的接口,但是实现类可以具有不同的参数。
例如
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基类),以便该对象封装动态性质并仍允许接口为静态。到那时,无论如何,您基本上都在处理类型系统。