【问题标题】:How is it possible to override a property with a new type? [duplicate]如何用新类型覆盖属性? [复制]
【发布时间】:2017-05-10 23:41:39
【问题描述】:

我不明白它是如何完美编译和工作的:|

什么时候可以在覆盖时更改属性的类型(从Nullable<bool>bool 以及从intNullable<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'

【问题讨论】:

    标签: c# .net polymorphism


    【解决方案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': 类型必须是 'bool?'匹配被覆盖的成员 'BaseClass.BaseBoolNullable'

    'DerivedClass.BaseInt':类型必须是 'int' 以匹配被覆盖的成员 'BaseClass.BaseInt'

    【讨论】:

    • 在我的问题中编写这样的代码是否有很大的代码气味?比如道德上的错误或什么
    • 你的第二个例子不会编译,对吧?
    • @ibiza 我会说这是代码异味的相当大的迹象用于隐藏成员,但这几乎总是一个坏主意
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2013-04-05
    • 2017-08-22
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    相关资源
    最近更新 更多