Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为C#.NET中的子类设置特定属性?_C#_.net - Fatal编程技术网

如何为C#.NET中的子类设置特定属性?

如何为C#.NET中的子类设置特定属性?,c#,.net,C#,.net,首先,让我声明我是.NET新手,如果我的问题太幼稚或答案太直截了当,我会提前道歉。我做了一些研究,测试了不同的东西,但我不能让它工作。我想做的是: 我的表单中有很多不同的工具提示,我希望它们具有相同的属性。例如: mySampleTooltip.ShowAlways = true; mySampleTooltip.IsBalloon = true; mySampleTooltip.AutomaticDelay = 750; mySampleTooltip.AutoPopDelay = 32767

首先,让我声明我是.NET新手,如果我的问题太幼稚或答案太直截了当,我会提前道歉。我做了一些研究,测试了不同的东西,但我不能让它工作。我想做的是:

我的表单中有很多不同的工具提示,我希望它们具有相同的属性。例如:

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的最新版本甚至强制执行静态-它们现在需要由类名限定。