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

标签 c# inheritance overriding

我的基类声明:

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/

相关文章:

java - 为什么在这里调用父类(super class)方法?

c# - 在 ASP.Net Datagrid 中隐藏列

c# - 如何使用 MongoDB 部署 C# .net 应用程序

c# - 在 RDLC 的同一 Tablix 中显示列的小计

c# - 实现 "Inherit"(实现)通用接口(interface)的接口(interface)?

Javascript:仍然对 instanceof 运算符感到困惑

c# - 如何使用构造函数创建 C# 类并让它返回字符串?

java - 有没有办法在匿名类中初始化最终字段?

java - Java中的@override和Python中的@decorator的区别

c# - 将-1转换为uint C#