C#与可选方法的接口

我明白,接口是合同,任何改变(甚至增加)打破任何相关的代码。 然而,我可以发誓我读了一段时间后,最近的.NET版本(3,3.5 ??)添加了一个新的属性,可以应用到新的接口成员。 该属性允许版本化和/或使成员可选。 它会是这样的:

interface ITest { void MethodOne(); [InterfaceVersion(2)] void MethodTwo(); } 

我已经看到这个高低,但似乎无法find它。 我想知道,我是不是误解了我认为自己读过的东西,而没有这样的东西。 有人有任何见解吗?

你应该创build两个接口:

 interface ITest { void MethodOne(); } interface ITest2 : ITest { void MethodTwo(); } 

这也将明确哪些function需要哪个版本的接口,这样就不必检查实现接口的类是否只实现一个或两个方法。

我没有看到这样的属性,但我想这是可能的。 MSDN上的这篇文章介绍了使用overridesnew关键字进行版本控制。

简而言之,C#配备了允许派生类进化并仍然保持兼容性的语言function。 这个例子展示了一个纯粹基于派生的关系,但是基础实际上会实现你需要版本化的接口。 有一个接口需要另一个(以前的版本)接口与此方法相结合也是非常有用的。

创build需要另一个接口的示例:

 public interface IMyInterface { void FirstMethod(); } public interface IMySecondInterface : IMyInterface { void SecondMethod(); } 

使用inheritance来维护兼容性的示例:

 public class MyBase { public virtual string Meth1() { return "MyBase-Meth1"; } public virtual string Meth2() { return "MyBase-Meth2"; } public virtual string Meth3() { return "MyBase-Meth3"; } } class MyDerived : MyBase { // Overrides the virtual method Meth1 using the override keyword: public override string Meth1() { return "MyDerived-Meth1"; } // Explicitly hide the virtual method Meth2 using the new // keyword: public new string Meth2() { return "MyDerived-Meth2"; } // Because no keyword is specified in the following declaration // a warning will be issued to alert the programmer that // the method hides the inherited member MyBase.Meth3(): public string Meth3() { return "MyDerived-Meth3"; } public static void Main() { MyDerived mD = new MyDerived(); MyBase mB = (MyBase) mD; System.Console.WriteLine(mB.Meth1()); System.Console.WriteLine(mB.Meth2()); System.Console.WriteLine(mB.Meth3()); } } 

您是否想过在C#4中新增“无pia”function? 也就是说,我们允许您仅将PIA中实际使用的界面部分“链接”,然后您可以跳过将PIA运送到您的客户。 如果您在几个不同的程序集中进行了多次这样的操作,CLR会完成确定所有这些链接的部分接口在逻辑上是相同types并统一它们的工作。 通过这种方式,您可以将实现接口的各种风格的对象从一个程序集传递到另一个程序集,而这一切只是起作用。 但是,“no pia”接口创build的原始接口必须相同。

.NET框架中没有这样的属性。

我知道没有这样的一个接口实现部分实现的属性。 但是,您可以使用抽象类来解决这个问题:

 public abstract class Test { public abstract void MethodOne(); public virtual void MethodTwo() { } } 

这将允许用户决定在inheritanceTest时是否要重写MethodTwo,同时强制重写MethodOne。

我最近在缺乏多重inheritance的情况下,禁止将现有的接口转换成抽象类,并且find了一个扩展的解决scheme:

  interface IFoo { int RowCount(); } static class _FooExtensions { public static bool HasAnyRows (this IFoo foo) { return foo.RowCount() > 0; } } 

这样你可以提供一个默认的版本,以防你的抽象方法可以用其他函数来定义。

你可能读过类似的东西

  interface ITest { void MethodOne(); [InterfaceVersion(2)] void MethodTwo(); } [AttributeUsage(AttributeTargets.All)] public class InterfaceVersion : System.Attribute { public readonly int N; public InterfaceVersion(int n) { this.N = n; } } 

但是我不认为可以使MethodTwo实现可选。

编辑:

我刚刚通过运行代码发现,它确实没有使MethodTwo实现可选。

您可能正在考虑部分方法 ( MSDN )。