C# – 从派生的方法中隐藏UserControl类的所有方法
我有一个自定义用户控件。 通常它inheritanceUserControl
类。 但通过这种方式,它inheritance了UserControl
所有公共方法和属性。 但我想隐藏所有这些并实现我自己的一些方法和属性。
假设我有一个名为CustomControl
的自定义控件。
public class CustomControl : UserControl
当我创建CustomControl
的实例时:
CustomControl cControl = new CustomControl();
当我输入cControl.
intellisense为我提供了从UserControl
派生的所有方法和属性。 但我想只列出我在CustomControl
类中实现的。
谢谢
您可以创建一个接口,然后只显示该接口的方法和属性。
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的范围设置为内部或受保护的内部。
这不是inheritance的工作方式。 通过创建子类,您明确表示您希望所有基类的方法和属性都可访问。
为什么不使用组合并使UserControl成为自定义控件的成员而不是inheritance它?
您可以通过在类中隐藏它们来隐藏它们(使用关键字new
重新声明每个inheritance的方法),并将EditorBrowsableAttribute
应用于它们。 但是方法仍然存在,并且仍然可以调用。 通常,没有办法禁止客户端在类的实例上调用inheritance的方法。
你有一些选择:
- 使用
EditorBrowsableAttribute
将隐藏intellisense中的属性 - 使用
BrowsableAttribute
将隐藏属性网格中的属性 - 使用“私有新”隐藏属性本身会将它们隐藏起来
需要考虑的事项:
- 使用属性将隐藏属性,具体取决于“使用者”的实现,但在语言级别,您不会隐藏任何内容。 例如,您可以在显示属性之前实现检查EditorBrowsableAttribute的属性网格。 [我不确定微软的Windows Forms实现]
- 使用“private new”也会阻止您访问属性,但是,在您的控件中,您还可以调用
base.PropertyName
来访问原始属性。
我理解你的意图。 通常会限制enherited控件的行为,即使它“破坏”inheritance概念。
不要inheritanceUserControl
,而是inheritanceControl
。
你可以通过汇总来做到这一点
public CustomControl { private Control control_; public property control {get{ return _control;}} . . . public void FunctionIWantExposed() {} }
但这并不是特别有用。 您将无法将其添加到任何控件集合中。 您可以在自定义类控件中使用该属性并将其添加到controlscollection中,但是您尝试隐藏的所有这些方法都会再次暴露。