0

有没有办法覆盖子类中的变量,但也可以将类型更改为该类型的子类。IE。

public class BaseClass
{
    public BaseClass() { }
    protected virtual MyBase WorkField { get { return new MyBase(); } }
    public int WorkProperty
    {
        get { return WorkField.Value; }
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass():base() { }

    /* I get an error here saying that WorkField needs to be MyBase type*/
    protected override MyExtend WorkField 
    { 
        get 
        { 
            return new MyExtend(); 
        }
    }

    //public new int WorkProperty
    //{
    //    get { return 0; }
    //}
}

public class MyBase
{
    public int Value = 1;
}

public class MyExtend : MyBase
{
    public int value = 20;
}

有没有办法与此类似,但有效?所以我可以有一个超类在 MyBase 上执行任务,然后有一个子类在它的 MyEntend 版本上执行任务。每次我使用它时都不需要投射它。

4

3 回答 3

1

在这种情况下,没有理由更改签名。只需返回派生类型:

public class DerivedClass : BaseClass
{
    public DerivedClass():base() { }

    protected override MyBase WorkField 
    { 
        get 
        { 
            return new MyExtend(); 
        }
    }

    //public new int WorkProperty
    //{
    //    get { return 0; }
    //}
}

您的子类的多态行为将允许您返回它。

于 2013-02-14T08:58:28.760 回答
1

对于覆盖签名应该是基本的基本方法。

public class BaseClass<T> where T : MyBase, new()
{
    public BaseClass() { }
    protected virtual T WorkField { get { return new T(); } }
    public int WorkProperty { get { return WorkField.Value; } }
}

public class DerivedClass : BaseClass<MyBase>
{
    public DerivedClass() : base() { }

// 发生同样的错误,因为基础属性是“MyBase”类型

protected override MyExtend WorkField { get { return new MyExtend(); } }

    //public new int WorkProperty
    //{
    //    get { return 0; }
    //}
}
于 2013-02-14T09:42:19.003 回答
0
    public class BaseClass<T> where T: MyBase, new()
    {
        public BaseClass() { }
        protected virtual T WorkField { get { return new T(); } }
        public int WorkProperty { get { return WorkField.Value; } }
    }

    public class DerivedClass : BaseClass<MyExtend>
    {
        public DerivedClass() : base() { }
        protected override MyExtend WorkField { get { return new MyExtend(); } }

        //public new int WorkProperty
        //{
        //    get { return 0; }
        //}
    }

    public class MyBase
    {
        public MyBase()
        {

        }
        public int Value = 1;
    }
    public class MyExtend : MyBase
    {
        public int value = 20;
    }
于 2013-02-14T09:00:10.680 回答