C# 新建静态字段并隐藏公共继承成员

C# 新建静态字段并隐藏公共继承成员,c#,.net,vb.net,inheritance,C#,.net,Vb.net,Inheritance,奇怪的情况: public class MyTextBox : TextBox { // I want use the same height for all MyTextBoxes public new static int Height; } public Form1() { InitializeComponent(); MyTextBox mtb1 = new MyTextBox(); MyTextBox mtb2 = new MyTextBox

奇怪的情况:

public class MyTextBox : TextBox
{
    // I want use the same height for all MyTextBoxes
    public new static int Height;
}

public Form1()
{
    InitializeComponent();

    MyTextBox mtb1 = new MyTextBox();
    MyTextBox mtb2 = new MyTextBox();

    mtb1.Multiline = true;
    mtb2.Multiline = true;

    mtb1.Location = new Point(50, 100);
    mtb2.Location = new Point(200, 100);

    mtb1.Size = new Size(50, 50);
    mtb2.Size = new Size(150, 150);

    Controls.Add(mtb1);
    Controls.Add(mtb2);

    mtb1.Text = mtb1.Height;
    mtb2.Text = mtb2.Height;
    // Error 1 Member 'WindowsFormsApplication9.MyTextBox.Height'
    // cannot be accessed with an instance reference;
    // qualify it with a type name instead
}
在VB.NET中也是这样

Public Class MyTextBox
    Inherits TextBox
    Public Shared Shadows Height As Integer
End Class

mtb1.Text = mtb1.Height ' Text will be "0" '
'Warning 1   Access of shared member, constant member, enum member or nested '
' type through an instance; qualifying expression will not be evaluated.
问题:

==

  • 这个方法不行吗 用于隐藏 政府中的公共成员 上课?有时这可能是错误的 有用的
  • 如何对所有成员使用相同的
    高度

  • 什么时候有用?我真的不认为以这种方式隐藏成员是个好主意。这只会引起维护方面的噩梦——当你看到“高度”时,你很难分辨出它真正指的是哪个成员


    依我看,“new”只能用作最后的绝望行为,通常是在基类引入了与现有成员冲突的成员时。它不应该被用作故意避免常规OO设计原则的一种方式。

    什么时候有用?我真的不认为以这种方式隐藏成员是个好主意。这只会引起维护方面的噩梦——当你看到“高度”时,你很难分辨出它真正指的是哪个成员


    依我看,“new”只能用作最后的绝望行为,通常是在基类引入了与现有成员冲突的成员时。它不应该被用作故意避免正常OO设计原则的一种方式。

    重复的我还问如何为文本框使用公共/静态/共享高度重复的我还问如何为文本框使用公共/静态/共享高度OK,所有文本框的高度如何?或者我应该重命名该字段?@serhio:如果确实需要一个字段,那么一定要重命名该字段。@Jon Skeet:如果基类提供了一个不应提供给特定派生类(例如MemberwiseClone)的后代的受保护成员,该怎么办?通过使用显然不应该使用的东西(例如枚举类型DontTryThis的WriteOnly属性,其唯一定义的值为DontTryThis.NoReallyDont)来隐藏受保护的成员似乎比让它可用(允许错误调用)要好。专门用于隐藏继承方法的关键字可能更好,但我不知道在vb.net或C#中有这样的关键字。@supercat:如果基类提供了受保护的成员,那么所有派生类都应该可以看到它。否则就违反了利斯科夫的替代原则。基本上,这是一个糟糕的设计——不要用“new”来掩饰它。@Jon Skeet:LSP对于类的公共成员很重要,因为从“bar”派生的派生类“foo”可能会传递给需要“bar”的代码。如果不能用“foo”代替“bar”,这样的代码就会中断。这种多态性对于受保护的方法来说不是问题。如果类“foo”继承自“bar”,则foo对象的基将是“bar”。时期不可能从“bar”继承其他类,并以某种方式成为foo的基础。底座不可替代这一事实是首先有受保护的成员的一个重要原因。好吧,所有文本框的高度都一样吗?或者我应该重命名该字段?@serhio:如果确实需要一个字段,那么一定要重命名该字段。@Jon Skeet:如果基类提供了一个不应提供给特定派生类(例如MemberwiseClone)的后代的受保护成员,该怎么办?通过使用显然不应该使用的东西(例如枚举类型DontTryThis的WriteOnly属性,其唯一定义的值为DontTryThis.NoReallyDont)来隐藏受保护的成员似乎比让它可用(允许错误调用)要好。专门用于隐藏继承方法的关键字可能更好,但我不知道在vb.net或C#中有这样的关键字。@supercat:如果基类提供了受保护的成员,那么所有派生类都应该可以看到它。否则就违反了利斯科夫的替代原则。基本上,这是一个糟糕的设计——不要用“new”来掩饰它。@Jon Skeet:LSP对于类的公共成员很重要,因为从“bar”派生的派生类“foo”可能会传递给需要“bar”的代码。如果不能用“foo”代替“bar”,这样的代码就会中断。这种多态性对于受保护的方法来说不是问题。如果类“foo”继承自“bar”,则foo对象的基将是“bar”。时期不可能从“bar”继承其他类,并以某种方式成为foo的基础。基地不可替代这一事实是首先拥有受保护成员的一个重要原因。