C# 如何在不修改的情况下扩展.net接口?
首先,我要说的是,我不是一名专业的开发人员,但我有大量的代码供不同的公司使用,主要是用.NETC#和vb编写的 话虽如此,我从未觉得有必要扩展现有的类和接口,现在我确实想这样做,我有点挣扎,下面是一个例子:C# 如何在不修改的情况下扩展.net接口?,c#,.net,vb.net,C#,.net,Vb.net,首先,我要说的是,我不是一名专业的开发人员,但我有大量的代码供不同的公司使用,主要是用.NETC#和vb编写的 话虽如此,我从未觉得有必要扩展现有的类和接口,现在我确实想这样做,我有点挣扎,下面是一个例子: 我已将COM引用添加到另一个应用程序的项目中(无法编辑此) 这个引用有一个我想要扩展的接口,例如,_CellObject,我想向它添加一些方法。在过去,我会构建自己的类来处理这个问题,这是可行的,但我认为更合适的方法是扩展它 因此,我构建了另一个接口,从_CellObject继承并添加了我的
有人能把我推到正确的方向吗?这是真的。如果通过从接口继承来扩展接口,那么在实现从新接口继承的类时,您将需要从接口及其继承的接口实现所有方法。从某种意义上说,这就是让新接口继承现有接口的意义所在。否则,您可以只创建一个新接口,而不从现有接口继承。COM对象不支持实现继承或多态性,因此不会有任何受保护的成员供您重写。我通常不会看到开发人员尝试扩展COM对象。如果需要添加相关功能,可以将其包装()或编写扩展方法。实际上有两种方法可以扩展接口而不修改它。首先创建从该接口继承的另一个接口。假设您有一个
接口
,并且希望扩展它
interface A
{
void SomeMethodA();
}
interface B :A
{
void SomeMethodB();
}
其次,您可以直接实现该接口
class C : A
{
public void SomeMethodA()
{
//your actual implementation
}
}
public interface _CellObject
{
void DoSomething();
}
public interface _CellObject2 : _CellObject
{
void DoSomethingElse();
}
public class CellObject : _CellObject
{
public void DoSomething()
{
}
}
public class CellObject2 : CellObject, _CellObject2
{
public void DoSomethingElse()
{
DoSomething();
}
}
一个选项(不包括COM的问题)是创建一个新的接口和类,其中包含旧版本的功能。现在,您的新类可以从原始类继承,保留其功能,同时使用新接口对其进行扩展
class C : A
{
public void SomeMethodA()
{
//your actual implementation
}
}
public interface _CellObject
{
void DoSomething();
}
public interface _CellObject2 : _CellObject
{
void DoSomethingElse();
}
public class CellObject : _CellObject
{
public void DoSomething()
{
}
}
public class CellObject2 : CellObject, _CellObject2
{
public void DoSomethingElse()
{
DoSomething();
}
}
只要从现有接口扩展另一个接口,这称为接口隔离
public interface IContract
{
void DoSomething();
}
public interface IContractChanged:IContract
{
void DoSomethingMore();
}
现在,您可以实现新的合同IContractChanged以满足您的需要。您的第四点让我假设您有一些现有接口的默认实现,希望在新接口中重复使用。正如其他人已经提到的,您可以通过继承来扩展现有接口。但是,您还需要在实现新接口的类中实现“旧”方法 如果希望在新类中重用默认实现,只需将其提供给其构造函数即可。所以你有这个代码:
interface IBase
{
void DoSomething();
}
interface IDerived : IBase
{
void SoSomethingMore();
}
class MyBase : IBase
{
public void DoSomething() { ... }
}
class MyDerived : IDerived
{
private readonly MyBase _m;
public MyDerived(MyBase m) { this._m = m; }
// now you only need to forward the call for the existing interface to the injected base-class
public void DoSomething() => this._m.DoSomething();
public void DoSomethingMore() => ...
}
可以扩展接口,但这不是您想要的。您想要的是从COM扩展一个类,但这是不可能的,因为它是一个COM,并且肯定它在类上没有分部。您唯一能做的就是将COM类封装到您的类中。COM接口是一个契约,描述其他应用程序实现的内容。因此,在您自己的代码中扩展它没有任何意义,您必须首先改进其他应用程序。这通常是不可能的,因为你没有它的源代码,大概是“不能编辑这个”的意思。所以现在停下来,它不起作用了。谢谢Hans,我决定用我以前的方式来包装它。如果我理解正确的话,这就是我试图做的,实现接口A的问题是它必须包含100多个我不想处理的其他方法。接口定义了一个契约。你必须履行那个合同。如果您不想实现某些方法,可以为您实现的方法抛出
NotImplementedException
。没错,但我确实想实现这些方法的原始实现。问题是,如果不包括Icontract的所有原始属性和方法,我无法实现。不幸的是,我需要实现的方法/属性太多了。是的,但我的意思是,使用此方法,您只需要实现新方法。原始接口需要所有其他方法,因此我如何不实现它们?