c# - 在具有不同数据类型的派生类中覆盖 C# 变量
问题描述
我的基类声明:
public double Value;
我的派生类声明:
public new decimal Value;
在使用new
关键字的提示中,它说:“ ...Use the new keyword if hiding was intended.
”。
这个解释似乎不正确。使用new
关键字时,它不会隐藏基本变量。它使两个变量具有相同的名称,甚至具有不同的值。
我知道我这边存在设计问题,但我想知道为什么new
关键字并没有真正隐藏基类变量。此外,new
如果关键字意味着设计问题(更改派生类中的数据类型),为什么它甚至可用。在这里使用dynamic
选项吗?问题是:在大多数情况下,double
都很好。但是在一些派生类中,它必须是decimal
.
这个问题的重点是new
派生类中变量关键字的使用,而不是真正讨论双精度和小数之间的区别。
谢谢你。
解决方案
您混合了关于 ( new
, override
) 和 ( property
, field
) 的概念。
我将提供一些关于他们的信息并提供我的建议。我的建议在第三部分。
如果这篇文章没有回答您的问题,请使用用例编辑您的帖子。
new
不是override
new
是“隐藏”基类的属性/字段,它不是覆盖virtual
函数。
总结一下:
override
当virtual
需要更改基类的功能或abstract
需要定义功能时使用。
如果子类调用foo
调用虚函数的基类函数bar
,则将调用 CHILD 版本bar
,而不是基版本。
- 对于
new
,
如果子类调用调用函数foo
的基类的函数bar
,则将调用 BASE 版本bar
,而不是子版本。
我很少使用新的,所以不能建议如何使用它。
Ref新的和覆盖之间的区别
您不能覆盖字段。
public class foo
{
public double field; // This is field
public int property // This is property
{
get{ return 1 };
}
}
属性是 get/set 函数的包装。
属性可以被覆盖(因为#1),但字段不能被覆盖。
Ref字段和属性有什么区别?
建议
我想到的是Value
作为一个object
属性来实现
public class foo
{
public virtual object Value
{
get; set;
}
}
然后将其包装为所需的类型,但这将花费box 和 unboxing。
但是,如果您的情况不是性能关键,那应该没问题。
public class bar : foo
{
public override object Value
{
get{ // something different
};
set{ // something different
};
}
public double DesiredValue
{
get{ return (double)Value };
}
}
推荐阅读
- javascript - 我是否需要取消订阅已完成的流?
- python-3.x - 将 xml 文件从 url 解析为 astropy votable 而无需下载
- javascript - 使用 AJAX 和 JSON 从 JavaScript 发送数据到服务器并从服务器检索数据
- android - 即使设置为 Xamarin Forms v4.2.0.848062 也没有可启动的活动
- javascript - Paypal 结帐按钮,不适用于 Node.js 和 Express
- c# - 在 c# 中使用新版本的 chromedriver、chrome 和 selenium 时出现点击问题
- numpy - 在 numpy 中交换值和索引
- c# - 从 sqlite 查询时 DateTime 不正确
- sql-server - 在 SQL 中声明标量变量错误 - SSMS
- vue.js - 使用其他浏览器时如何在 Vue.js 中设置警报?