C# 如何在不修改的情况下扩展.net接口?

C# 如何在不修改的情况下扩展.net接口?,c#,.net,vb.net,C#,.net,Vb.net,首先,我要说的是,我不是一名专业的开发人员,但我有大量的代码供不同的公司使用,主要是用.NETC#和vb编写的 话虽如此,我从未觉得有必要扩展现有的类和接口,现在我确实想这样做,我有点挣扎,下面是一个例子: 我已将COM引用添加到另一个应用程序的项目中(无法编辑此) 这个引用有一个我想要扩展的接口,例如,_CellObject,我想向它添加一些方法。在过去,我会构建自己的类来处理这个问题,这是可行的,但我认为更合适的方法是扩展它 因此,我构建了另一个接口,从_CellObject继承并添加了我的

首先,我要说的是,我不是一名专业的开发人员,但我有大量的代码供不同的公司使用,主要是用.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的所有原始属性和方法,我无法实现。不幸的是,我需要实现的方法/属性太多了。是的,但我的意思是,使用此方法,您只需要实现新方法。原始接口需要所有其他方法,因此我如何不实现它们?