1

我有一个基础对象,它实现了一个只有 getter 的属性。在我的子类中,我想同时实现:

public ref class NTObject
{
  property ::System::String ^ Name {
    virtual ::System::String ^ get ();
  }
};

public ref class NTNamed
  : ROOTNET::NTObject,
    ROOTNET::Interface::NTNamed
{
  property ::System::String ^ Name {
    virtual ::System::String ^ get () override;
    virtual void set (::System::String ^ value);
  }
};

然后,当我编写以下简单代码时:

    static void Main(string[] args)
    {
        var n = new ROOTNET.NTNamed("hi", "there");
        Console.WriteLine(n.Name);
        n.Name = "hi there";
        Console.WriteLine(n.Name);
        var obj = n as ROOTNET.NTObject;
        Console.WriteLine(obj.Name);
    }

我在“n.Name =”行上收到构建错误 - “无法将属性或索引器 ROOTNET.NTObject.Name 分配给 - 它是只读的” - 简而言之,它缺少我分类为的事实NTNamed 对象。因此,我将上面的“override”关键字替换为“new”关键字。现在它将构建,并且上面的代码可以正常工作。但是,我认为代码片段的最后两行不起作用——它将调用 NTObject 的 Name getter,而不是 NTNamed 的 getter。

我在 stackoverflow 中看到了其他关于 C# 中这个问题的问题,但我认为,因为我对如何定义 getter/setter 有非常精细的控制,所以我可以解决这些问题(例如,参见C# Setter for an抽象吸气剂

有没有一种方法可以像我编写上面的代码一样使用 override 关键字,而不是 new 关键字?非常感谢!

4

0 回答 0