【问题标题】:Multiple inheritance problem in C#C#中的多重继承问题
【发布时间】:2010-11-23 14:53:50
【问题描述】:

我需要在 C# 中使用 WPF 中的多重继承。

我正在制作一个控件,可以说是从组合框控件派生的 Control-1。我向我的控件 Control-1 类添加了一些依赖属性和方法。我的 control-1 中的大多数属性和方法(实际上是相同的属性和方法实现)也可以在另一个名为 Control-2 的控件中使用,但该控件不应派生自组合框控件(如 Control- 1).

我想在另一个类中分离公共依赖属性和方法,但在另一个类中分离它需要我从组合框控件和包含属性和方法的公共类派生我的控件类 (control-1)。

有没有设计可以解决我的问题。

注意:问题是关于 C# 使用 WPF 框架的依赖属性,它需要静态成员,而不仅仅是一般的 C#。

相关

How to reuse code when multiple inheritance is not an option?

Multiple Inheritance in C#

How To Implement Shared Behavior Between Classes (Without Multiple Inheritance Of Course) in C#

What are some good alternatives to multiple-inheritance in .NET?

【问题讨论】:

标签: c# wpf inheritance


【解决方案1】:

一种可能适合您的解决方案是创建一个接口,并将您的实现放在扩展方法中。

【讨论】:

  • 这种方法的唯一问题是,您要么在每个实现类中都有相同方法的重复实现,要么需要使用可能笨拙且难以实现的委托注入逻辑调试。
  • @free-dom 说“并将你的​​实现放在扩展方法中”的部分缓解了大部分问题。
【解决方案2】:
【解决方案3】:

我不能直接谈论依赖属性的情况,所以我会谈谈一般问题,如果有帮助的话。

您不能在 C# 中对实现进行多重继承。但是,您可以附加一个接口。

所以你可以定义接口:

interface IWhatever
{
    ...
}

然后,您可以像这样在类中实现该接口的功能:

class M : IWhatever
{
}

现在,您可以参加您希望拥有此附加功能的课程:

class B : MustExtend, IWhatever
{
    private M myMImpl = new M();

   // implement functions, call to 'myMImpl' for implementation.
}

这称为“组合”。我认为它在某些情况下可能很有用,并且通常未被充分利用:)

【讨论】:

  • 我同意你的观点。但主要问题是依赖属性。有没有办法我可以利用相同的依赖属性定义。
【解决方案4】:

我使用了从派生类调用的存根,并将基类型的类作为参数。这给我留下了几个单行功能。太糟糕了。

【讨论】:

    【解决方案5】:

    扩展方法和接口的问题是依赖属性需要声明静态成员和公共属性,例如:

        public PermissionEnum Permission
        {
            get { return (PermissionEnum)GetValue(PermissionProperty); }
            set { SetValue(PermissionProperty, value); }
        }
    
        public static readonly DependencyProperty PermissionProperty =
            DependencyProperty.Register("Permission", typeof(PermissionEnum), typeof(SecurityMenuItem), new FrameworkPropertyMetadata(PermissionEnum.DeliveryView));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 2021-07-28
      • 2012-08-08
      • 2021-05-08
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多