【问题标题】:Is there a way to bypass/circumvent the single class inheritance limit in C#.NET?有没有办法绕过/规避 C#.NET 中的单类继承限制?
【发布时间】:2013-08-04 15:17:03
【问题描述】:

我最近在一次采访中被问到是否知道有一种方法可以绕过/规避 .NET 限制,即类只能从单个类继承,而不能从多个类继承。显然我不知道答案,否则我不会在这里问这个问题。没有实现多个接口(这似乎是一个错误的答案)或将类链接到一个从另一个继承自另一个的地方,还有另一种我不知道的方法来完成这个吗?

【问题讨论】:

    标签: .net oop inheritance


    【解决方案1】:

    没有实现多个接口(这似乎是一个错误的答案)或将类链接到一个继承自另一个继承另一个的类,还有另一种我不知道的方法来实现这一点吗?

    不,我怀疑实现多个接口是正确的答案。

    这是相当标准的。假设您有课程FooBar,并且您希望课程FooBarFooBar“继承”。然后创建接口IFooIBar 并拥有Foo : IFooBar : IBar。然后你会定义FooBar : IFoo, IBar 和标准实现将是

    class FooBar : IFoo, IBar {
        private readonly IFoo foo = new Foo();
        private readonly IBar bar = new Bar();
        // or pass these in as dependencies
    
        public void Moo() {
            foo.Moo();
        }
    
        public void Mar() {
             bar.Mar();
        }
    }
    

    是的,它可以写很多东西,但并不难那么(VS或R#中有工具可以帮助加快速度一点点)。

    【讨论】:

    • 我相信对象组合是正确的方法。在实践中,我发现 FooBarFooBar 分开构建时质量更高。
    • 原谅我的无知,但我不明白这里有什么意义?您仍然必须在 FooBar 类中编写 Moo 和 Mar 方法的实现,但实际实现是在 Foo 和 Bar 类中,而您只能调用这些方法。这就是这个结构的重点吗?
    • 重点是这是在 C# 中模仿多重继承的标准方式。 MooMar 的实现只是将调用转发给适当的接收者,这正是多重继承中会发生的事情。如果需要,您甚至可以覆盖该行为。
    • 您将如何覆盖该行为?你能证明一下吗?
    • @Marko:不要将调用FooBar.Moo 转发到Foo.Moo,只需实现新行为即可。那就是不要调用foo.Moo,而是做其他事情。
    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 2011-03-20
    • 2011-01-14
    • 2021-10-04
    • 1970-01-01
    • 2010-09-28
    • 2023-02-03
    • 2023-01-24
    相关资源
    最近更新 更多