C# 维护控件之间的子/父关系

C# 维护控件之间的子/父关系,c#,user-interface,user-controls,polymorphism,parent-child,C#,User Interface,User Controls,Polymorphism,Parent Child,我正在编写一个WP7GUI,并设计了一个控件类和一个ParentControl类,该类派生自控件并具有一系列子控件。但是,将子项添加到ParentControl实例时,我无法访问该子项的父项引用,因为我将其设置为“受保护”,不受控件用户的影响 准确的误差为 无法通过“Control”类型的限定符访问受保护成员“Control.Parent”; 限定符的类型必须为“ParentControl”(或从中派生) 公共抽象类控件//如按钮或单选按钮 { 公共ParentControl父项{get;p

我正在编写一个WP7GUI,并设计了一个控件类和一个ParentControl类,该类派生自控件并具有一系列子控件。但是,将子项添加到ParentControl实例时,我无法访问该子项的父项引用,因为我将其设置为“受保护”,不受控件用户的影响

准确的误差为


无法通过“Control”类型的限定符访问受保护成员“Control.Parent”;
限定符的类型必须为“ParentControl”(或从中派生)


公共抽象类控件//如按钮或单选按钮
{
公共ParentControl父项{get;protected set;}
}
公共抽象类ParentControl:控件//如面板或菜单
{
受保护的列表子项=新列表();;
公共void AddChild(控制子项,int索引)
{
NeedSizeUpdate=true;
if(child.Parent!=null)
child.Parent.RemoveChild(child);
child.Parent=this;//如何访问父级?
子项。插入(索引,子项);
onchildaded(索引,子项);
}
}


我该如何解决这个问题?

是的,这是因为其他东西可能派生自
控件,而
父控件只能访问它派生自的控件的基本成员。例如,如果
Control2
派生自
Control
,则
ParentControl
将不会派生自
Control2
,因此无法访问其基本成员

因此,您可以将
Parent
设置为公共属性,或者如果您希望将其隐藏在控件的普通用户之外,则可以通过接口进行访问,并显式实现它:

interface IChildControl
{
    ParentControl Parent { get; set; }
}

public abstract class Control : IChildControl //such as a button or radio button
{
    ParentControl IChildControl.Parent { get; set; }
}

显式实现(
IChildControl.Parent
)意味着只有
Control
实例的使用者将看不到
Parent
属性。必须将它显式转换为
IChildControl
才能访问它。

我强烈建议永远不要将
Control
用作自定义类名称similar SO Post-
interface IChildControl
{
    ParentControl Parent { get; set; }
}

public abstract class Control : IChildControl //such as a button or radio button
{
    ParentControl IChildControl.Parent { get; set; }
}