【问题标题】:How can I inherit from a control class and an abstract class?如何从控制类和抽象类继承?
【发布时间】:2019-09-10 17:57:33
【问题描述】:

我有一个类,它的方法接受一个参数,必须是一个带有预期方法的控件。
我已经用这些方法创建了一个接口。
我创建了一个抽象类,它继承自 Control 并实现了将所有方法抽象化的接口(这是我上面参数的类型)。
然后我创建了一个继承自 TableLayoutPanel 并实现接口的类。
我创建了这个类的一个实例,但是我不能将它用作参数。
我知道为什么。但是解决方法是什么?我知道我可以向返回 Control 实例的接口添加一个方法。在这种情况下,TableLayoutPanel,但我想使用实例本身...
另外,我不想在接收参数的方法中进行强制转换,例如,它必须是“编译时/类型安全”才能在库中使用......

class CollapsibleList : Panel
{
    public void AddItem(CollapsibleListItem item)
    {
        someContainer.Controls.Add(item);
        item.CollapsibleListItemCollapse();
    }    
}

public interface ICollapsibleListItem
{
    string CollapsibleListItemName { get; }
    void CollapsibleListItemCollapse();
    void CollapsibleListItemExpand();
}

public abstract class CollapsibleListItem : Control, ICollapsibleListItem
{
    public abstract string CollapsibleListItemName { get; }
    public abstract void CollapsibleListItemCollapse();
    public abstract void CollapsibleListItemExpand();
}

class ListBoxCollapsibleListItem : TableLayoutPanel, ICollapsibleListItem
{
    //... implemented interface methods
}

class Main
{
    public void SomeMethod()
    {
        var item = new ListBoxCollapsibleListItem();
        var collapsibleList = new CollapsibleList();
        collapsibleList.AddItem(item as CollapsibleListItem); //cast error!
    }
}

【问题讨论】:

  • 为什么CollapsibleListItem 不实现TableLayoutPanel 而不是ListBoxCollapsibleListItem
  • 因为它可以是任何子类的控件。
  • 你只能从CollapsibleListItem继承ListBoxCollapsibleListItem
  • 同时子类化 TableLayoutPanel? C# 不允许你...
  • 您在这里尝试实现的目标是不可能的。 C# 不允许多重继承,ListBoxCollapsibleListItem 已经实现了一个类

标签: c#


【解决方案1】:

试试下面,

collapsibleList.AddItem(item as ICollapsibleListItem);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多