如何使用新类型覆盖属性?

时间:2017-05-10 23:41:40

标签: c# .net polymorphism

我不明白这是如何编译和完美的:|

在覆盖属性时,何时可以更改属性的类型(从Nullable<bool>bool以及从int更改为Nullable<int>)?

public class Program
{
    public static void Main(string[] args)
    {
        var testBase = new BaseClass();
        var testDerived = new DerivedClass();

        Console.WriteLine("'" + Convert.ToString(testBase.BaseInt) + "'");
        Console.WriteLine("'" + Convert.ToString(testDerived.BaseInt) + "'");

        Console.WriteLine("'" + Convert.ToString(testBase.BaseBoolNullable) + "'");
        Console.WriteLine("'" + Convert.ToString(testDerived.BaseBoolNullable) + "'");
    }
}

public class BaseClass
{
    public bool? BaseBoolNullable { get; set; }
    public int BaseInt { get; set; }
}

public class DerivedClass : BaseClass
{
    public new bool BaseBoolNullable { get; set; }
    public new int? BaseInt { get; set; }
}

输出:

'0'
''
''
'False'

1 个答案:

答案 0 :(得分:1)

你没有overridden基本属性,只有hidden个。

如果你这样更改DerivedClass,要访问基类的属性,你会发现它们仍然可用。

public new bool BaseBoolNullable
{
    get { return base.BaseBoolNullable ?? false; }
    set { base.BaseBoolNullable = value; }
}
public new int? BaseInt
{
    get { return base.BaseInt; }
    set { base.BaseInt = value ?? 0; }
}

如果您使用了virtualoverride,那么您会看到,如您所料,您实际上无法覆盖具有其他类型的属性。

public class BaseClass
{
    public virtual bool? BaseBoolNullable { get; set; }
    public virtual int BaseInt { get; set; }
}

public class DerivedClass : BaseClass
{
    public override bool BaseBoolNullable { get; set; }
    public override int? BaseInt { get; set; }
}
  

'DerivedClass.BaseBoolNullable':type必须是'bool?'匹配重写成员'BaseClass.BaseBoolNullable'

     

'DerivedClass.BaseInt':type必须为'int'才能匹配被覆盖的成员'BaseClass.BaseInt'