如何在更高的类中使用重写的属性值

本文关键字:重写 属性 | 更新日期: 2023-09-27 18:28:04

我正在使用IoC来定义我继承的类中的一些行为。我有房地产

protected virtual bool UsesThing { get { return true; } }

在我的顶级班级。

在我继承的班级里,我有

protected override bool UsesThing { get { return false; } } 

我在我的顶级类中使用这个属性,它使用的是顶级值。有没有办法让它使用继承的值?我以为虚拟应该这么做。

代码示例:

using System;
public class Program
{
    public static void Main()
    {
        B b = new B();
        b.PrintThing();
    //I want this to print the value for B
    }
    public class A
    {
        protected virtual bool Enabled
        {
            get
            {
                return true;
            }
        }
        public void PrintThing()
        {
            Console.WriteLine(this.Enabled.ToString());
        }
    }
    public class B : A
    {
        protected override bool Enabled
        {
            get
            {
                return false;
            }
        }
    }
}

这是一个Dot-Net Fiddle演示我的问题

如何在更高的类中使用重写的属性值

您可以这样做:

https://dotnetfiddle.net/SOiLni

A本身对B的实现一无所知,因此必须实例化B的对象才能访问其overriden属性。

稍微修改过的小提琴版本:

public class Program
{
    public static void Main()
    {
        A a = new A();
        a.PrintThing();
        A newA = new B();
        newA.PrintThing();
    }
    public class A
    {
        protected virtual bool Enabled
        {
            get
            {
                return true;
            }
        }
        public void PrintThing()
        {
            Console.WriteLine(this.Enabled.ToString());
        }
    }
    public class B : A
    {
        protected override bool Enabled
        {
            get
            {
                return false;
            }
        }
    }
}

给定您的代码示例,AEnabled将被打印出来。

当你创建一个A时,它对B一无所知,所以从多晶型上讲,你不能指望它使用它的值。这是因为,如果您有一个同样派生自A的类C,它将不知道该使用什么!

另一方面,如果你写过:

public static void Main()
{
    A a = new B();
    a.PrintThing();
}

当您创建该类型的实例时,您会期望(正确地)它将使用B的重写。

您的代码一定有其他问题。此代码将分别打印"true"answers"false":

public class BaseClass {
    public virtual bool DoesSomething {
        get {
            return true;
        }
    }
    public void Print() {
        Console.WriteLine(DoesSomething);
    }
}
public class ChildClass : BaseClass {
    public override bool DoesSomething {
        get {
            return false;
        }
    }
}

然后使用这些类:

        BaseClass bc = new BaseClass();
        bc.Print();
        ChildClass sc = new ChildClass();
        sc.Print();

如果我猜测您可能正在创建父类的实例,即使您的意图是创建子类的实例。