igo*_*jrr 3 c# inheritance overriding
我的基类声明:
public double Value;
Run Code Online (Sandbox Code Playgroud)
我的派生类声明:
public new decimal Value;
Run Code Online (Sandbox Code Playgroud)
在使用关键字的提示中new,它说:“ ...Use the new keyword if hiding was intended.”。
这个解释似乎不太正确。当使用new关键字时,它并没有隐藏基变量。它使两个变量保持相同的名称,甚至具有不同的值。
我知道我这边存在设计问题,但我想知道为什么关键字并new没有真正隐藏基类变量。另外,new如果关键字意味着设计问题(更改派生类中的数据类型),为什么它甚至可用。这里使用dynamic一个选项吗?问题是:在大多数情况下,double都很好。但是在一些派生类中,它必须是decimal.
这个问题的重点是派生类中变量关键字的使用new,而不是真正讨论 double 和decimal 之间的差异。
谢谢。
new您混淆了 ( , override) 和 ( property, )的概念field。
我将提供一些有关他们的信息并提供我的建议。我的建议是第三部分。
如果这篇文章没有回答您的问题,请使用用例编辑您的文章。
new不是overridenew是“隐藏”基类的属性/字段,这不是重写virtual函数。
总结:
overridevirtual当需要更改基类的函数或abstract需要定义函数时使用。foo如果子类调用基类的函数,而基类又调用了虚函数,则将调用bar子类版本,而不是基类版本。bar
new,如果子类调用基类的函数,foo而基类又调用函数,则将调用 的barBASE 版本,而不是子版本。bar
我很少使用 new,所以无法建议如何使用它。
public class foo
{
public double field; // This is field
public int property // This is property
{
get{ return 1 };
}
}
Run Code Online (Sandbox Code Playgroud)
属性是 get/set 函数的包装。
属性可以被覆盖(因为#1),但字段不能被覆盖。
Ref字段和属性有什么区别?
我想到的是Value作为object财产来实施
public class foo
{
public virtual object Value
{
get; set;
}
}
Run Code Online (Sandbox Code Playgroud)
然后将其包装成所需的类型,但这会花费box 和 unboxing。
但是,如果您的情况对性能要求不高,那么应该没问题。
public class bar : foo
{
public override object Value
{
get{ // something different
};
set{ // something different
};
}
public double DesiredValue
{
get{ return (double)Value };
}
}
Run Code Online (Sandbox Code Playgroud)