簡體   English   中英

如何在C#子類中重寫而不是隱藏成員變量(字段)?

[英]How do I override, not hide, a member variable (field) in a C# subclass?

我想告訴我ItemA和ItemB的名稱。 它應該告訴我“ Subitem \\ nSubitem”,但是卻告訴我“ Item \\ nSubitem”。 這是因為Subitem類中定義的“ Name”變量在技術上與基本Item類中定義的“ Name”變量不同。 我想將原始變量更改為新值。 我不明白為什么這不是有史以來最簡單的事情,考慮到虛擬和重寫可以完美地與方法配合使用。 我完全無法找到如何實際覆蓋變量。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine(ItemA.Name);
            System.Console.WriteLine(ItemB.Name);
            System.Console.ReadKey();
        }
        static Item ItemA = new Subitem();
        static Subitem ItemB = new Subitem();
    }
    public class Item
    {
        public string Name = "Item";
    }
    public class Subitem : Item
    {
        new public string Name = "Subitem";
    }
}

您不能覆蓋 C#中的變量,但是可以覆蓋屬性:

public class Item
{
    public virtual string Name {get; protected set;}
}
public class Subitem : Item
{
    public override string Name {get; protected set;}
}

另一種方法是更改​​子類中的值,如下所示:

public class Item
{
    public string Name = "Item";
}
public class Subitem : Item
{
    public Subitem()
    {
        Name = "Subitem";
    }
}

對於字段(您稱為變量),沒有多態性的概念(這就是使override執行其工作的原因)。 您需要在這里使用的是屬性。

public class Item
{
    public virtual string Name
    {
        get { return "Item"; }
    }
}

public class SubItem : Item
{
    public override string Name
    {
        get { return "Subitem"; }
    }
}

“覆蓋變量”是什么意思?

變量是概念內存中的命名位置(“概念性”,因為它可能是一個寄存器,盡管對於字段而言不太可能)。

覆蓋方法會將一組操作替換為另一組操作。

由於內存中的命名位置不是一組操作,您如何替換它? 期望使用內存中的命名位置應該做什么?

如果要更改存儲在存儲器中的內容,請在構造派生類時執行以下操作:

public class Item
{
  public string Name = "Item";
}
public class Subitem : Item
{
  public SubItem()
  {
    Name = "Subitem";
  }
}

如果要覆蓋為一組操作,則定義一組要覆蓋的操作(方法或屬性)。

這個問題比較老,作者可能使用的是C#5.0或更低版本。 但我有一個相同的問題,遇到了一個非常簡潔的解決方案,該解決方案可與C#6.0及更高版本一起使用,我想與您分享:

C#6.0提供了初始化自動屬性的功能。 因此,可以這樣使用:

public class Item
{
    public virtual string Name { get; set; } = "Item";
}

public class Subitem : Item
{
    public override string Name { get; set; } = "Subitem";
}

可能的解決方案是使用屬性並覆蓋其getter ,如下所示:

public class Item
{
    public virtual string Name { get { return "Item"; } }
}
public class Subitem : Item
{
    public override string Name { get { return "Subitem"; } }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM