为什么重新锐化要求我不要从抽象类中隐藏属性?它希望我使用'new',但这总是更可取吗?这似乎暗示隐藏变量使用户无法做base.property是一件坏事.
我对这个OO概念感到有些困惑,并且想知道是否有充分的理由支持或反对它.
我有
public abstract class baseClass{
protected string commonProperty {get; set;}
}
public abstract class moreSpecificBaseClass : baseClass {
// Resharper would prefer I use 'new' below
protected string commonProperty = "Some specific setting";
}
public class verySpecificClass : moreSpecificBaseClass {
// Some code
}
Run Code Online (Sandbox Code Playgroud)
小智 5
从MSDN文档:
虽然您可以在不使用new修饰符的情况下隐藏成员,但结果是警告.如果使用new来显式隐藏成员,则会抑制此警告并记录派生版本旨在替代的事实.
隐藏班级成员可能会导致误解和微妙的错误.因此编译器会警告您,并要求您通过使用"new"修饰符使您可能有害成员的意图隐藏.这可以防止意外隐藏基础类型成员而不被忽视.
查看隐藏成员时问题如何隐藏到代码中的小例子:
public abstract class A
{
public int Value = 0;
}
public class B : A
{
// This hides the Value member from the base type A
public new int Value = 0;
}
static void SetValue(B obj, int value)
{
obj.Value = value;
}
static void AddToValue(A obj, int value)
{
obj.Value += value;
}
static void Main(string[] args)
{
B obj = new B();
SetValue(obj, 11);
AddToValue(obj, 5);
Console.Out.WriteLine("obj.Value = " + obj.Value);
Console.Out.WriteLine("((A) obj).Value = " + ((A) obj).Value);
Console.Out.WriteLine("((B) obj).Value = " + ((B) obj).Value);
}
Run Code Online (Sandbox Code Playgroud)
这将输出:
obj.Value = 11
((A) obj).Value = 5
((B) obj).Value = 11
Run Code Online (Sandbox Code Playgroud)
只需查看Main方法的流程,您可能会认为在方法结束时obj.Value的值为16(= 11 + 5).但事实并非如此 - 更糟糕的是:根据您访问Value成员的方式,您将遇到不同的值.
现在,在这个小例子中,输出不一致而不是所有情况下的预期值的原因可能很容易且很快发现.但是想象一下更大的软件项目有很多类,很多继承,方法参数是抽象基类或接口类型,第三方类库,你给它命名......,隐藏成员引起的问题可能变得更加困难鉴别.