C# - 隐藏UserControl类的所有方法

时间:2009-11-18 23:57:46

标签: c# inheritance user-controls base-class

我有自定义用户控件。通常它继承UserControl类。但通过这种方式,它继承了UserControl的所有公共方法和属性。但我想隐藏所有这些并实现我自己的一些方法和属性。

假设我有一个名为CustomControl的自定义控件。

public class CustomControl : UserControl

当我创建CustomControl的实例时:

CustomControl cControl = new CustomControl();

当我输入cControl.时,intellisense为我提供了从UserControl派生的所有方法和属性。但是我想只列出我在CustomControl类中实现的。

7 个答案:

答案 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)

你有一些选择:

  1. 使用EditorBrowsableAttribute将隐藏intellisense中的属性
  2. 使用BrowsableAttribute将隐藏属性网格中的属性
  3. 使用“private new”隐藏属性本身会将其隐藏起来
  4. 需要考虑的事项:

    1. 使用属性将隐藏属性,具体取决于“使用者”的实现,但在语言级别,您不会隐藏任何内容。例如,您可以在显示属性之前实现检查EditorBrowsableAttribute的属性网格。 [我不确定微软的Windows窗体实现]
    2. 使用“private new”也会阻止您访问这些属性,但是,在您的控件中,您仍然可以调用base.PropertyName来访问原始属性。
    3. 我明白你的意图。尽管它“破坏”了继承概念,但通常会限制enherited控件的行为。

答案 5 :(得分:0)

不要继承UserControl,而是继承Control

答案 6 :(得分:0)

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

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

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