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的方法。

你有一些选择:

  1. 使用EditorBrowsableAttribute将隐藏intellisense中的属性
  2. 使用BrowsableAttribute将隐藏属性网格中的属性
  3. 使用“私有新”隐藏属性本身会将它们隐藏起来

需要考虑的事项:

  1. 使用属性将隐藏属性,具体取决于“使用者”的实现,但在语言级别,您不会隐藏任何内容。 例如,您可以在显示属性之前实现检查EditorBrowsableAttribute的属性网格。 [我不确定微软的Windows Forms实现]
  2. 使用“private new”也会阻止您访问属性,但是,在您的控件中,您还可以调用base.PropertyName来访问原始属性。

我理解你的意图。 通常会限制enherited控件的行为,即使它“破坏”inheritance概念。

不要inheritanceUserControl ,而是inheritanceControl

你可以通过汇总来做到这一点

 public CustomControl { private Control control_; public property control {get{ return _control;}} . . . public void FunctionIWantExposed() {} } 

但这并不是特别有用。 您将无法将其添加到任何控件集合中。 您可以在自定义类控件中使用该属性并将其添加到controlscollection中,但是您尝试隐藏的所有这些方法都会再次暴露。