[英]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.