给定一个我无法更改的父类(super class),它定义了某个属性,我如何最好在子类中设置它的默认值?
例如,我正在子类化 System.Windows.Forms.ToolStripButton
并希望为 Text
属性设置默认值。 (对于更复杂的示例,我还想定义点击处理程序,例如
Click += new EventHandler(click)
。)我最好如何做到这一点?
我的一些想法:
在构造函数中设置它。但是对于多个构造函数,这可行吗? (我还没有完全掌握构造函数如何相互配合。我可以只更新一个并让它们全部正常工作™吗?)
将其设置为字段,即
public string Text = "foo";
正如我所料,这不起作用。始终调用某个方法来设置这些值(我可能会命名它,例如
InitializeComponent
)。
理想情况下,我会进一步子类化此类,并希望在其中定义默认值。我想对于这一面,我会有 protected 字段,并让构造函数或方法读取这些值并分配它们。
还有其他我没有想到的方法吗?
或者我的设计看起来不正确?我还可以使用不同的类并使用其中的 ToolStripButton
实例 - 聚合而不是继承。 (我越想这个,就越觉得这可能是正确的答案。)
这是一种我确切知道如何在 Python 中做的事情,但在 C# 中看起来不太优雅(我知道:不同风格的语言、权衡等;我不是在批评 C# )。
最佳答案
构造函数可能是最简单的路线。如果出现问题,您始终可以以菊花链方式连接构造函数,例如:
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(...)]
添加到属性中,以便绑定(bind)(UI、序列化器等)了解它。在本例中,为[DefaultValue(12)]
。
关于c# - 我应该如何设置子类中属性的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556874/