如何为C#.NET中的子类设置特定属性?
首先,让我声明我是.NET新手,如果我的问题太幼稚或答案太直截了当,我会提前道歉。我做了一些研究,测试了不同的东西,但我不能让它工作。我想做的是: 我的表单中有很多不同的工具提示,我希望它们具有相同的属性。例如:如何为C#.NET中的子类设置特定属性?,c#,.net,C#,.net,首先,让我声明我是.NET新手,如果我的问题太幼稚或答案太直截了当,我会提前道歉。我做了一些研究,测试了不同的东西,但我不能让它工作。我想做的是: 我的表单中有很多不同的工具提示,我希望它们具有相同的属性。例如: mySampleTooltip.ShowAlways = true; mySampleTooltip.IsBalloon = true; mySampleTooltip.AutomaticDelay = 750; mySampleTooltip.AutoPopDelay = 32767
mySampleTooltip.ShowAlways = true;
mySampleTooltip.IsBalloon = true;
mySampleTooltip.AutomaticDelay = 750;
mySampleTooltip.AutoPopDelay = 32767;
我认为可能会有一个更优雅的解决方案,而不是对每个工具提示都这样做,并将代码粘贴100次。我的想法是创建一个类ToolTip的子类,我称之为PermaToolTip,并从这个特定类创建对象(顺便问一下,这是正确的方法还是有更好的方法?)
我的代码如下所示:
public class PermaToolTip : ToolTip
{
private bool _ShowAlways;
private bool _IsBalloon;
private int _AutomaticDelay;
private int _AutoPopDelay;
// SET ShowAlways Property for subclass
public bool ShowAlways
{
get
{
return _ShowAlways;
}
set
{
_ShowAlways = true;
}
}
// SET IsBalloon Property for subclass
public bool IsBalloon
{
get
{
return _IsBalloon;
}
set
{
_IsBalloon = true;
}
}
// SET AutomaticDelay Property for subclass
public int AutomaticDelay
{
get
{
return _AutomaticDelay;
}
set
{
_AutomaticDelay = 750;
}
}
// SET AutoPopDelay Property for subclass
public int AutoPopDelay
{
get
{
return _AutoPopDelay;
}
set
{
_AutoPopDelay = 32767;
}
}
}
但它不起作用。具体而言:
1) 我在酒店名称下方看到一条绿线和一条警告,上面写着:
警告:“ResellerErratingsGUI.PermaToolTip.ShowAlways”隐藏继承的成员“System.Windows.Forms.ToolTip.ShowAlways”。如果要隐藏,请使用新关键字
2) 我实例化了类PermaToolTip的一个对象,但它没有我想要的属性
对评论的回答:这不是用户定义的控件。它是.NET控件
知道我做错了什么吗?基类已经有了这些属性。这样做会导致编译器抱怨(因为您在隐藏基类成员时没有使用
new
表示要隐藏它)
您不需要创建新属性-只需在构造函数中设置所需的基类默认值:
public class PermaToolTip : ToolTip
{
public PermaToolTip()
{
// Define defaults differently now
this.ShowAlways = true;
this.IsBalloon = true;
this.AutomaticDelay = 750;
this.AutoPopDelay = 32767;
}
}
这将导致您的类使用
工具提示
属性,但使用不同的默认值。创建一个工具提示,然后使用SetToolTip,这样您就不需要100个工具提示,只需要少量甚至一个
直接从MSDN
private void Form1_Load(object sender, System.EventArgs e)
{
// Create the ToolTip and associate with the Form container.
ToolTip toolTip1 = new ToolTip();
// Set up the delays for the ToolTip.
toolTip1.AutoPopDelay = 5000;
toolTip1.InitialDelay = 1000;
toolTip1.ReshowDelay = 500;
// Force the ToolTip text to be displayed whether or not the form is active.
toolTip1.ShowAlways = true;
// Set up the ToolTip text for the Button and Checkbox.
toolTip1.SetToolTip(this.button1, "My button1");
toolTip1.SetToolTip(this.checkBox1, "My checkBox1");
}
首先,如另一个答案中所述,子类中的成员不应与基类中的成员具有相同的名称,除非您的意图是重写它们的行为。在这种情况下,您应该只覆盖虚拟或抽象成员 从设计的角度来看,我建议采用不同的方法。子类的唯一用途似乎是创建一个填充了默认值的工具提示实例。没有必要使用继承来实现这一点。更确切地说,你应该考虑某种帮助器,它会给你提供一个带有默认值的工具提示实例。这样你就不会被一种你不一定想要或不需要的具体类型所束缚 示例类:
public static class DefaultToolTip
{
public static void Create()
{
ToolTip tip = new ToolTip();
tip.ShowAlways = true;
tip.IsBalloon = true;
tip.AutomaticDelay = 750;
tip.AutoPopDelay = 32767;
return tip;
}
}
用法:
ToolTip toolTip = DefaultToolTip.Create();
“但它不起作用”——请避免使用这句话,并解释在什么意义上事情不起作用。错误消息、行为等。这些工具提示是在.NET控件上还是在用户定义的控件上?另外,您如何设置“PermaToolTip”?当您编写一个子类,即从
工具提示
派生的类时,您的类将继承基类的所有成员。因此,您不能再次定义所有这些成员。相反,只需将已经存在的成员设置为所需的值。请参阅Reed Copsey的答案。因此,使用此方法,我只是使用SetToolTip根据与之关联的控件更改其值?是的。如果你有很多这样的海报,通过控件查找工具提示文本将是一个额外的功能。对原始海报的评论(Reed Copsey当然知道这一点):你不必写这个。
如果你不想写的话。类似于ShowAlways
的内容将自动引用perma工具提示上的ShowAlways
属性,因此此
限定符是多余的。@JeppeStigNielsen True。话虽如此,这并不是一个糟糕的做法(StyleCop对成员访问强制执行这个。
))很有趣。StyleCop是否在所有情况下都强制执行该操作(如内部实例方法和属性,即使成员未被其他变量或类型“隐藏”),还是仅在实例构造函数内部赋值?@JeppeStigNielsen是。它可以防止重构。否则,在重命名变量时,您实际上可能会意外地将自己重构为代码中的功能更改。stylecop的最新版本甚至强制执行静态-它们现在需要由类名限定。