我的基类声明:
public double Value;
我的派生类声明:
public new decimal Value;
在使用 new
关键字的提示中,它说:“...如果打算隐藏,请使用 new 关键字。
”。
这个解释似乎不正确。使用 new
关键字时,它不会隐藏基本变量。它使两个变量具有相同的名称,甚至具有不同的值。
我知道我这边存在设计问题,但我想知道为什么 new
关键字没有真正隐藏基类变量。此外,如果 new
关键字意味着设计问题(更改派生类中的数据类型),为什么它甚至可用。在这里使用 dynamic
是一个选项吗?
问题是:在大多数情况下,double
没问题。但是在一些派生类中,它必须是 decimal
。
这个问题的重点是在派生类中对变量使用 new
关键字,而不是真正讨论 double 和 decimal 之间的区别。
谢谢。
最佳答案
您混合了关于 (new
, override
) 和 (property
, field
) 的概念。
我将提供有关它们的一些信息并提供我的建议。 我的建议是在第三部分。
如果这篇文章没有回答您的问题,请使用用例编辑您的文章。
new
不是override
new
是为了“隐藏”基类的属性/字段,它不会覆盖 virtual
函数。
总结:
override
在基类的virtual
函数需要改变或者需要定义abstract
函数时使用。
如果子类调用基类的函数foo
,基类调用虚函数bar
,则子类的bar
会被调用,不是基本版本。
- 对于
新
,
如果子类调用基类的函数foo
,基类调用函数bar
,则将调用bar
的BASE 版本,不是 child 版。
我很少使用 new,所以无法建议如何使用它。
引用 Difference between new and override
您不能覆盖字段。
public class foo
{
public double field; // This is field
public int property // This is property
{
get{ return 1 };
}
}
属性是 get/set 函数的包装器。
属性可以被覆盖(因为 #1),但字段不能被覆盖。
引用 What is the difference between a field and a property?
建议
我想到的是将 Value
实现为 object
属性
public class foo
{
public virtual object Value
{
get; set;
}
}
然后将其包装成所需的类型,但这将花费 box and unboxing .
但是,如果您的情况不是性能关键型的,应该没问题。
public class bar : foo
{
public override object Value
{
get{ // something different
};
set{ // something different
};
}
public double DesiredValue
{
get{ return (double)Value };
}
}
关于c# - 在具有不同数据类型的派生类中覆盖 C# 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62481881/