【发布时间】: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#