派生类中字段的默认值

时间:2018-04-04 13:50:54

标签: 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);        
}

4 个答案:

答案 0 :(得分:5)

您不需要不同的字段,您需要同一字段的不同初始化

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

}

class Derived : Base {
    public Derived() { name = "Y"}; //same {name } field of a Base class
}

答案 1 :(得分:4)

您可以考虑使用虚拟属性而不是公开公共字段(被视为bad practice)。

因此,您可以(使用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";
}

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

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

public class Hammer : ItemBase
{
    public override string Name { get { return "Hammer"; } }
}

答案 2 :(得分:1)

您没有在派生类型中定义新的默认值,而是声明一个全新的字段,该字段隐藏了基类中具有相同名称的字段。

因为字段不能是虚拟的,所以返回的字段是在您调用它的类型中声明的字段。

解决方案?不要重新声明新字段,只需将新值分配给派生类型的构造函数中的现有字段:

public class Hammer
{
    public Hammer() {
        Name = "Hammer"; }
}

答案 3 :(得分:-1)

尝试弄清楚在围绕.NET版本限制滑行时究竟需要什么一直是一个令人头痛但我有一个解决方案。根据您的评论,您可以使用构造函数。

在这种情况下,使用属性(这是处理您的情况的首选方式)而非公共字段非常容易:

public class ItemBase
{   
    public ItemBase()
    {
        //When instantiating ItemBase the value of Name is "Base"
        Name = "Base"; 
    }

    public string Name { get; set; }
}

public class Hammer : ItemBase
{
    public Hammer()
    {
        //When instantiating Hammer the value of Name is "Hammer"
        Name = "Hammer";
    }
}

要测试一下这个:

public class Program
{
    public static void Main()
    {
        ItemBase itemBase = new Hammer();
        Console.WriteLine(itemBase.Name);
        itemBase.Name = "Foo";
        Console.WriteLine(itemBase.Name);
    }
}

输出:

Hammer
Foo

这个应该检查所有方框。您现在使用属性(使您的代码更好),每个类都有一个默认值,并且可以在实例化后更改属性。