使用不同的数据类型重写派生类中的 C# 变量

igo*_*jrr 3 c# inheritance overriding

我的基类声明:

public double Value;
Run Code Online (Sandbox Code Playgroud)

我的派生类声明:

public new decimal Value;
Run Code Online (Sandbox Code Playgroud)

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

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

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

这个问题的重点是派生类中变量关键字的使用new,而不是真正讨论 double 和decimal 之间的差异。

谢谢。

Lou*_* Go 5

new您混淆了 ( , override) 和 ( property, )的概念field

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

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


new不是override

new是“隐藏”基类的属性/字段,这不是重写virtual函数。

总结:

  1. overridevirtual当需要更改基类的函数或abstract需要定义函数时使用。

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

  1. 为了new

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

我很少使用 new,所以无法建议如何使用它。

参考new 和 override 之间的区别


您不能覆盖字段。

public class foo
{
    public double field; // This is field
    public int property  // This is property
    {
        get{ return 1  };
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 属性是 get/set 函数的包装。

  2. 属性可以被覆盖(因为#1),但字段不能被覆盖。

Ref字段和属性有什么区别?


建议

我想到的是Value作为object财产来实施

public class foo
{
    public virtual object Value
    {
        get; set;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将其包装成所需的类型,但这会花费box 和 unboxing

但是,如果您的情况对性能要求不高,那么应该没问题。

public class bar : foo
{
    public override object Value
    {
        get{ // something different
        }; 
        set{ // something different
        };
    }

    public double DesiredValue
    {
        get{  return (double)Value };
    }
}
Run Code Online (Sandbox Code Playgroud)