模拟接口中的虚拟方法

时间:2013-01-26 02:43:56

标签: c# oop inheritance interface multiple-inheritance

好吧,所以在C#中使用多重继承的方法是通过使用接口。虽然这是一个公平的解决方案,但它仍然要求您始终在界面内重新键入方法,而这些方法实际上不应该在类之间进行更改。

例如,如果我有一个方法.foo()作为Adabo接口的一部分,总是被发现做同样的事情(比如,它循环10次),但在某些开发点我发现我需要对它进行更改(比如,它实际上应该循环11次),我将不得不浏览从Adabo继承的每个类并相应地更改它们自己的.foo()。

我唯一想要的接口就是他们在多重继承时的免费传递,坦率地说。我对他们全部抽象的前提并不感兴趣。有办法解决这个问题吗?

4 个答案:

答案 0 :(得分:3)

没有背景,这是一个难以回答的问题。根据具体情况,不同的解决方案将比其他解决方案更合适。

首先,如其他地方所述 - 接口未指定实现,它们仅指定合同。实现将包含在某个基类中。一个类可以实现许多接口,但你真正的问题(我相信)是; “我怎样才能在C#类中实现许多接口,同时限制代码重复,因为多重继承是不可能的?”。

有很多选择,上下文很重要。但是,你可以进一步研究的一些一般原则;

  • Object composition;有一个班级由其他几个人组成。例如,class car类可以包含多个轮子,引擎,门等。轮子类可以在class Bus上重复使用
  • 横切问题/ Aspect oriented programming;当它是您想要复制的特定行为而不是具体概念时更合适。典型的例子是跟踪/记录;您希望所有方法都能记录,而无需在任何地方复制日志记录调用。有很好的工具可以在C#中支持这一点,例如PostSharp,但这种方法需要与“传统”OO设计有不同的设计思路。
  • Extension Methods;这是一个.NET构造,当您想要实现类型的行为而不实际修改该类型时,它非常方便。这里最好的例子是LINQ; IEnumerable的所有实现都可以使用LINQ方法,而无需实际直接实现任何内容。

正如我所说,背景很重要,如果没有它,这些只是可以在进一步研究中为您服务的一般指示。

答案 1 :(得分:1)

  

在C#中使用多重继承的方法是使用接口

不正确。类实现接口,它们不会继承。无法在C#(或任何其他托管语言)

中实现多重继承

关闭转换为多重继承的一种方法是使用聚合 - 创建一个“包装器”,它只是将函数调用传递回子部分。

  

如果我有一个方法.foo()作为Adabo接口的一部分,总是被发现做同样的事情(比如,它循环10次)

接口不会任何东西 - 它们只是定义具体类需要实现哪些方法/属性。

如果您的问题不仅仅是理论问题,那么我建议您发布一些您认为多重继承有价值的例子。可能有另一种模式可以满足您的需求。

答案 2 :(得分:1)

  

它仍然要求你总是在接口中重新键入那些在类之间不应该改变的方法

完全没有。您只需在基类上实现接口,实现在将实现接口的所有类中通用的方法,然后将余数声明为abstract - 这将迫使存在者实现它。

public interface MyInterface
{
    void SomeCommonMethod(object whatever);

    void SomeSpecialisedMethod(int someOtherParameter);
}

public abstract class MyBaseClass : MyInterface
{
    public void SomeCommonMethod(object whatever)
    {
        //do some stuff
    }

    public abstract void SomeSpecialisedMethod(int someOtherParameter);
}

public class SomeSpecialisedClass : MyBaseClass
{
    public override void SomeSpecialisedMethod(int someOtherParameter)
    {
        //do stuff that can't be done in the base class
    }
}

这显示了如何避免无休止地在所有需要它的类中“重新键入”接口实现。

话虽如此,使用接口并不等同于多重继承。在C#的早期,有很多关于此的讨论,并且普遍的共识是,在现实世界的情况下,实际上很少需要多重继承。我个人在我的职业生涯中只需要几次,在这些情况下有足够的解决方法 - 多重继承只是一种更清洁的方法。

  

我唯一想要的接口就是多重继承的免费传递

在我之后重复: 接口内没有多重继承。

一个接口可以实现几个其他接口,并且还定义自己的需求(契约),但在任何情况下都不是继承。您可以近似多重继承,但无法实现正确的多重继承。

答案 3 :(得分:1)

似乎你混淆了几件事而感到困惑。如果我理解正确,你有一个界面,比如Adabo,它有一个名为foo()的方法。现在,您有许多实现此方法的类。根据你所写的内容,我认为这个方法的实现在所有这些类中是相同的,因此,令你感到困扰的是,当你想要改变实现时,你需要去改变所有这些。

嗯,这是你的问题。接口中的方法适用于不同实现类的情况,根据自己的需要实现不同。如果碰巧实现对所有人来说应该是相同的。那你有几个选择:

  1. 继承:通过具体或抽象类。将公共方法放在父类中,并对其进行扩展。如果你说子类已经扩展了其他类。然后你的下一个赌注是,

  2. 组合:将常用功能放在组件类中,并将其包含在需要使用它的其他类中。所以,而不是Adabo接口,有类Adabo

    类Adabo {

    foo();
    

    }

  3. 然后在你所有的子课上都有

    class childA {
    
       Adabo a;
    
       ...
       a.foo();
    }
    
    class childB {
    
       Adabo a;
    
       ...
       a.foo();
    }
    
    class childC {
    
       Adabo a;
    
       ...
       a.foo();
    }