如何在更高的类中使用重写的属性值
本文关键字:重写 属性 | 更新日期: 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;
}
}
}
}
给定您的代码示例,A
的Enabled
将被打印出来。
当你创建一个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();
如果我猜测您可能正在创建父类的实例,即使您的意图是创建子类的实例。