gpt4 book ai didi

c# - 在具有不同数据类型的派生类中覆盖 C# 变量

转载 作者:行者123 更新时间:2023-12-05 02:06:45 25 4
gpt4 key购买 nike

我的基类声明:

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 函数。

总结:

  1. override 在基类的virtual 函数需要改变或者需要定义abstract 函数时使用。

如果子类调用基类的函数foo,基类调用虚函数bar,则子类的bar会被调用,不是基本版本。

  1. 对于

如果子类调用基类的函数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 };
}
}
  1. 属性是 get/set 函数的包装器。

  2. 属性可以被覆盖(因为 #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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com