2

给定一个我无法更改的超类,它定义了某个属性,我最好如何在子类中设置它的默认值?

例如,假设我正在子类System.Windows.Forms.ToolStripButton化并希望为该Text属性设置一个默认值。(对于更复杂的示例,我还想定义点击处理程序,例如 Click += new EventHandler(click)。)我最好如何做到这一点?

我有的一些想法:

  • 在构造函数中设置它。但是有多个构造函数,这可行吗?(我还没有完全掌握构造函数是如何相互配合的。我可以只更新一个并让它们全部为 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;
}

另一个选项是显式属性(不是自动属性)和字段初始化器:

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

在任何一种情况下,您都应该考虑添加[DefaultValue(...)]到属性中,以便绑定(UI、序列化程序等)知道它。在这种情况下,[DefaultValue(12)]

于 2012-11-25T23:59:21.280 回答