首页 > 解决方案 > 在具有不同数据类型的派生类中覆盖 C# 变量

问题描述

我的基类声明:

public double Value;

我的派生类声明:

public new decimal Value;

在使用new关键字的提示中,它说:“ ...Use the new keyword if hiding was intended.”。

这个解释似乎不正确。使用new关键字时,它不会隐藏基本变量。它使两个变量具有相同的名称,甚至具有不同的值。

我知道我这边存在设计问题,但我想知道为什么new关键字并没有真正隐藏基类变量。此外,new如果关键字意味着设计问题(更改派生类中的数据类型),为什么它甚至可用。在这里使用dynamic选项吗?问题是:在大多数情况下,double都很好。但是在一些派生类中,它必须是decimal.

这个问题的重点是new派生类中变量关键字的使用,而不是真正讨论双精度和小数之间的区别。

谢谢你。

标签: c#inheritanceoverriding

解决方案


您混合了关于 ( new, override) 和 ( property, field) 的概念。

我将提供一些关于他们的信息并提供我的建议。我的建议在第三部分。

如果这篇文章没有回答您的问题,请使用用例编辑您的帖子。


new不是override

new是“隐藏”基类的属性/字段,它不是覆盖virtual函数。

总结一下:

  1. overridevirtual需要更改基类的功能或abstract需要定义功能时使用。

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

  1. 对于new,

如果子类调用调用函数foo的基类的函数bar,则将调用 BASE 版本bar,而不是子版本。

我很少使用新的,所以不能建议如何使用它。

Ref新的和覆盖之间的区别


您不能覆盖字段。

public class foo
{
    public double field; // This is field
    public int property  // This is property
    {
        get{ return 1  };
    }
}
  1. 属性是 get/set 函数的包装。

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

推荐阅读