派生类中字段的默认值

Daa*_*win 0 c# inheritance

有没有办法让派生类覆盖基类的默认值?在下面的例子中,我需要Hammer.Name返回"Hammer".

public  class ItemBase   
{        
    public string Name = "Base";
}

public class Hammer: ItemBase
{
    new public string Name = "Hammer";
}



public class Test 
{
    ItemBase MyThing = new Hammer();

    // Prints "Base"
    Console.WriteLine(ItemBase.Name);        
}
Run Code Online (Sandbox Code Playgroud)

Tig*_*ran 5

您不需要不同的字段,需要对同一字段进行不同的初始化.

class Base {
    protected string name = ""; 
    public Base() { name = "X"};

}

class Derived : Base {
    public Derived() { name = "Y"}; //same {name } field of a Base class
}
Run Code Online (Sandbox Code Playgroud)


spe*_*der 5

您可能会考虑使用虚拟属性而不是公开公共字段(这被认为是不好的做法)。

因此,您可以(使用 C# 6.0):

void Main()
{
    ItemBase myThing = new Hammer();

    // Doesn't print "Base"
    Console.WriteLine(myThing.Name);

}

public class ItemBase
{
    public virtual string Name { get; } = "Base";
}

public class Hammer : ItemBase
{
    public override string Name { get; } = "Hammer";
}
Run Code Online (Sandbox Code Playgroud)

或者(如果您使用的是旧版本的 C#)...

public class ItemBase
{
    public virtual string Name { get { return "Base"; } }
}

public class Hammer : ItemBase
{
    public override string Name { get { return "Hammer"; } }
}
Run Code Online (Sandbox Code Playgroud)