如何使用可变参数/不同方法签名创建方法接口?
我正在尝试创建一个公共类的接口,但实现类可以有不同的参数。
例如
public interface IViewModel { //... void ResetReferences(); } // and then, in my class implementations, something like this: public class LocationViewModel : IViewModel { public void ResetReferences(List stateProvinces) //... } public class ProductViewModel : IViewModel { public void ResetReferences(List colors, List sizes) //... }
所以请注意我想要标准化“RestReferences”命名约定。 我很确定我不能这样做,但是有没有可行的设计模式? 例如在我的界面中,如下所示?
// variable parameters void ResetReferences(params object[] list);
但是,如何让我进行类型检查或让它调用我想要的实际方法签名等?
也许界面是错误的使用? 也许只是一个基类和一些编码约定?
谢谢,
用实现相关接口的对象替换args列表:
public interface IViewModel { //... void ResetReferences(IResetValues vals); }
我应该补充一点,IMO,“ResetReferences()”不应该参数…它应该重置为某个默认值,该默认值将特定于实现您的接口的各个类型…“重置”是这意味着,对我来说,“恢复到初始状态”…添加args意味着你可以控制它。
接口的目的是让客户端代码了解接口并忽略实现。 如果您的实现在调用时需要特殊处理,则客户端代码需要知道它调用的实现,然后接口的整个目的都将丢失。
除非我完全误解了你想要完成的事情,否则你就走错了路。
如果参数可以不同,那么它实际上不是一个通用接口。 这样说: 调用者是否需要知道实现类? 如果是这样,您就失去了接口的松耦合优势。
一种选择是将参数封装到另一种类型中,并使该类在该类型上通用。 例如:
public interface IViewModel { void ResetReferences(T data); }
然后,您将List
封装为一种类型,并可能将List
放入另一种类型中。
虽然有点尴尬……
您将需要实现接口方法,但您仍然可以执行所需的操作
public class LocationViewModel : IViewModel { public void ResetReferences(List stateProvinces) // ... void IViewModel.ResetReferences() // ... }
您必须在接口中具有这两种方法(并且具有不正确的实例抛出不支持的exception),或者让接口从其他两个接口inheritance到相同的效果。
接口定义是整个签名。
也可以将对象作为参数传递(可能从ParameterProvider基类派生),以便对象封装动态特性并仍然允许接口是静态的。 但那就是说,无论如何,你基本上都在使用类型系统。