我有自定义用户控件。通常它继承UserControl
类。但通过这种方式,它继承了UserControl
的所有公共方法和属性。但我想隐藏所有这些并实现我自己的一些方法和属性。
假设我有一个名为CustomControl
的自定义控件。
public class CustomControl : UserControl
当我创建CustomControl
的实例时:
CustomControl cControl = new CustomControl();
当我输入cControl.
时,intellisense为我提供了从UserControl
派生的所有方法和属性。但是我想只列出我在CustomControl
类中实现的。
答案 0 :(得分:6)
您可以创建一个接口,然后只显示接口的方法和属性。
public interface ICustomControl {
string MyProperty { get; set;}
}
public class CustomControl : UserControl, ICustomControl {
public string MyProperty { get; set; }
}
...
ICustomControl cControl = new CustomControl();
然后intellisense只显示MyProperty和Object的成员(以及扩展方法,如果有的话)。
编辑:
protected ICustomControl CustomControl { get; set; }
public Form1()
{
InitializeComponent();
CustomControl = this.customControl1;
CustomControl.MyProperty = "Hello World!"; // Access everything through here.
}
然后,如果需要,可以将CustomControl的范围设置为内部或受保护的内部。
答案 1 :(得分:4)
这不是继承的工作方式。通过创建一个子类,您明确表示您希望所有基类的方法和属性都可以访问。
答案 2 :(得分:1)
为什么不使用合成并使UserControl成为自定义控件的成员而不是继承它呢?
答案 3 :(得分:1)
您可以通过在类中隐藏它们来隐藏它们(使用关键字new
重新声明每个继承的方法),并将EditorBrowsableAttribute
应用于它们。但是这些方法仍然存在,并且仍然可以调用。通常,没有办法禁止客户端在类的实例上调用继承的方法。
答案 4 :(得分:1)
你有一些选择:
EditorBrowsableAttribute
将隐藏intellisense中的属性BrowsableAttribute
将隐藏属性网格中的属性需要考虑的事项:
base.PropertyName
来访问原始属性。我明白你的意图。尽管它“破坏”了继承概念,但通常会限制enherited控件的行为。
答案 5 :(得分:0)
不要继承UserControl
,而是继承Control
。
答案 6 :(得分:0)
你可以通过汇总来做到这一点,例如
public CustomControl
{
private Control control_;
public property control {get{ return _control;}}
.
.
.
public void FunctionIWantExposed() {}
}
但这并不是特别有用。您将无法将其添加到任何控件集合中。您可以在自定义类控件中使用该属性并将其添加到controlscollection中,但是您尝试隐藏的所有方法都会再次暴露。