我应该如何在子类中设置属性的默认值?

时间:2012-11-25 23:50:07

标签: c# .net-3.5 windows-forms-designer

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

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

我有过一些想法:

  • 在构造函数中设置它。但是有多个构造函数,这可行吗? (我还没有牢牢掌握构造者如何相互玩耍。我可以更新一个并将它们全部用于Just Work™吗?)

  • 将其设置为字段,即我预期的public string Text = "foo";,这不起作用。

  • 始终调用某个方法来设置这些值(我可能会将其命名为,例如InitializeComponent)。

理想情况下,我会进一步继承这个类,并希望在其中定义默认值。我想对于那一方我有保护字段并让构造函数或方法读取这些值并分配它们。

还有其他方法没有发生在我身上吗?

或者我的设计看起来不是正确的方法吗?我也可以使用不同的类,并在其中使用ToolStripButton实例 - 聚合而不是继承。 (我想的越多,感觉它就越正确就越正确。)

我确切知道如何在Python中做什么,但在C#中看起来不太优雅(我知道:不同风格的语言,权衡等等;我不批评C# )。

1 个答案:

答案 0 :(得分:2)

Constuctor可能是最简单的路线。如果构造函数存在问题,您始终可以菊花链式连接构造函数,例如:

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)]