2

特定のプロパティを定義する変更できないスーパークラスが与えられた場合、サブクラスでそのデフォルト値を設定するにはどうすればよいですか?

たとえば、サブクラス化System.Windows.Forms.ToolStripButtonを行っていて、プロパティのデフォルト値を設定したいとしTextます。(より複雑な例として、たとえば、クリック ハンドラーも定義したいと思います Click += new EventHandler(click))。

私が持っていたいくつかのアイデア:

  • コンストラクタで設定します。しかし、複数のコンストラクターを使用すると、それは実現可能ですか? (コンストラクターが互いにどのように機能するかについては、まだしっかりと把握できていません。1 つだけ更新して、すべて Just Work™ にすることはできますか?)

  • フィールドとして設定します。つまりpublic string Text = "foo";、予想どおり、これは機能しません。

  • これらの値を設定するには、常に特定のメソッドを呼び出します (たとえば、名前を付ける場合がありますInitializeComponent)。

理想的には、このクラスをさらにサブクラス化し、デフォルト値を定義したいと考えています。その側では、フィールドを保護し、コンストラクターまたはメソッドにそれらの値を読み取らせて割り当てさせると思います。

私に思い浮かばなかった他の方法はありますか?

または、私のデザインが正しくないように見えますか? 別のクラスを使用して、そのToolStripButton中のインスタンスを操作することもできます (継承ではなく集約)。(考えれば考えるほど、これが正解な気がします。)

これは、私が Python で行う方法を正確に知っている種類のものですが、C# ではあまり洗練されていないように見えます (私は知っています: 言語のさまざまなスタイル、トレードオフなど。C# を批判しているわけではありません)。

4

1 に答える 1

2

コンストラクターはおそらく最も簡単な方法です。問題がある場合は、いつでもコンストラクターをデイジーチェーン接続できます。次に例を示します。

public Foo() : this(12, "abc") {}
public Foo(int bar, string name) {
    this.bar = bar;
    this.name = name;
}

もう 1 つのオプションは、明示的なプロパティ (auto-props ではない) とフィールド初期化子です。

private int bar = 12;
public int Bar {
     get { return bar; }
     set { bar = value; }
}

いずれの場合も、[DefaultValue(...)]バインディング (UI、シリアライザーなど) がそれを認識できるように、プロパティに追加することを検討する必要があります。この場合、[DefaultValue(12)].

于 2012-11-25T23:59:21.280 に答える