【问题标题】:Confused between virtual and override for a property in c#在 C# 中的属性的虚拟和覆盖之间感到困惑
【发布时间】:2013-12-04 14:58:46
【问题描述】:

我正在将一个 c++ 文件翻译成 C#,我遇到了这行代码。

public property str1 Headers 
{
    virtual str1 get() override { return headers; }
}

那么,当我用 C# 编写这个时,它会怎么做呢?它是虚拟属性还是覆盖属性? 这是在继承自基类的类中定义的,该基类将此属性定义为抽象属性。

编辑:我认为它是 c# 中的一个属性,我翻译如下。但是get方法报错。

public str1 Headers
{
        override get  { return headers; }
        //virtual get { return headers; }
}

【问题讨论】:

  • 你得到什么错误?
  • 修改器覆盖对此项无效。如果我使用虚拟而不是覆盖,它也是一样的。

标签: c# overriding virtual abstract


【解决方案1】:

由于您要覆盖从基类继承的属性,因此只需在您的属性上使用override 修饰符。 对于属性,override 修饰符适用于 getset 访问器。

public class YourClass : SomeBaseClass
{
     public override str1 Headers
     {
         get 
         {
              return headers;
         }
     }
}

【讨论】:

  • 这成功了!谢谢。问题是我将覆盖应用于访问器而不是整个属性。
【解决方案2】:

在 C# 中,当您第一次声明属性、方法等时使用virtual具有可被覆盖的实现abstract 类似,但是当您声明它没有实现时,派生类必须覆盖它。属性的语法是:

public abstract class AbsClass1
{
    // non-abstract deriving class MUST override this
    public abstract str1 Headers { get; }
}

public class Class1
{
    // deriving class may override, but doesn't have to
    public virtual str1 Headers { get { return headers; } }
}

(也就是说,它应用于整个属性,而不是get

override 用于覆盖之前声明为virtual 的内容。例如。你可能有

public class Class2 : AbsClass1
{
    public override str1 Headers { get { return headers; } }
}

另请参阅 sealednew

【讨论】:

  • 我在abstract上添加了信息
【解决方案3】:

在 C++ 中,您需要在继承树的顶部使用 use 'virtual',但它不会在下面做任何事情,尽管按照惯例它用于覆盖函数。在 C++ 中存在一个危险,即签名的细微不匹配会导致函数在您认为它们可以充当覆盖时不充当覆盖,并且编译器无法就此向您发出警告。

在 C# 中,通过在顶部要求“虚拟”,然后在下面的所有覆盖上“覆盖”来避免这些问题。

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2012-11-19
    • 2016-06-10
    • 2018-05-05
    相关资源
    最近更新 更多