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

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

给定一个我无法更改的父类(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/

相关文章:

具有自动完成/自动过滤器的 WPF 组合框?

c# - 在已部署的 Web 应用程序中出现编译错误,但在 IDE 中却没有出现编译错误

c# - 如何将对象转换为 Type 类描述的类型?

c# - 我的 Windows 窗体在构建时不断缩小/调整大小

c# - Visual Studio 设计器中的抽象通用 UserControl 继承

c# - 为什么 WinForms 设计器中的控件会自行调整大小?

c# - 通过\u或\x为一个字符分配一个非常大的十六进制

c# - 获取 MS Project 文件的显示字段

c# - .net 核心的 FtpWebRequest 替代方案

c# - 将 javascript 函数传递给 ReactJS.NET 服务器端