1

カスタム ユーザー コントロールがあります。通常はUserControlクラスを継承します。しかし、このようにして、 のすべてのパブリック メソッドとプロパティを継承しますUserControl。しかし、これらすべてを非表示にして、独自のいくつかのメソッドとプロパティを実装したいと考えています。

という名前のカスタム コントロールがあるとしCustomControlます。

public class CustomControl : UserControl

のインスタンスを作成するとCustomControl:

CustomControl cControl = new CustomControl();

入力するとcControl.、intellisense は から派生したすべてのメソッドとプロパティを提供してくれますUserControlCustomControlしかし、クラスに実装されているものだけをリストしたいと思います。

4

7 に答える 7

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 のスコープを internal または protected internal にすることができます。

于 2009-11-19T00:04:10.987 に答える
4

それは継承の仕組みではありません。サブクラスを作成することで、基本クラスのすべてのメソッドとプロパティにアクセスできるようにすることを明示的に示しています。

于 2009-11-19T00:01:53.230 に答える
1

クラスでそれらをシャドウし (継承された各メソッドを keyword で再宣言new)、それらに適用EditorBrowsableAttributeすることで、IntelliSense からそれらを非表示にすることができます。ただし、メソッドは引き続き存在し、呼び出し可能です。一般に、クライアントがクラスのインスタンスで継承されたメソッドを呼び出せないようにする方法はありません。

于 2009-11-19T00:01:39.180 に答える
1

コンポジションを使用して、UserControl を継承するのではなく、カスタム コントロールのメンバーにしてみませんか?

于 2009-11-18T23:59:43.437 に答える
1

いくつかのオプションがあります:

  1. を使用EditorBrowsableAttributeすると、IntelliSense からプロパティが非表示になります
  2. を使用BrowsableAttributeすると、プロパティ グリッドからプロパティが非表示になります
  3. 「private new」を使用してプロパティ自体を非表示にすると、すべてから非表示になります

考慮事項:

  1. 属性を使用すると、「消費者」の実装に応じてプロパティが非表示になりますが、言語レベルでは何も非表示になりません。たとえば、プロパティを表示する前に EditorBrowsableAttribute をチェックするプロパティ グリッドを実装できます。[Microsoft の Windows Forms の実装についてはよくわかりません]
  2. 「private new」を使用すると、プロパティにアクセスできなくなりますが、コントロール内では、元のプロパティにアクセスするために呼び出すbase.PropertyNameことができます。

私はあなたの意図を理解しています。継承の概念を「壊す」にもかかわらず、継承されたコントロールの動作を制限するのが通常です。

于 2009-11-19T00:06:38.750 に答える
0

たとえば、集計を通じてこれを行うことができます

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

しかし、これは特に役に立ちません。コントロール コレクションに追加することはできません。カスタム クラス コントロールでプロパティを使用し、それをコントロール コレクションに追加することもできますが、非表示にしようとしているすべてのメソッドが再び公開されます。

于 2009-11-19T00:04:36.047 に答える
0

継承しないで、代わりUserControlに継承Controlします。

于 2009-11-18T23:59:59.660 に答える