我使用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;
}
}
}
}
答案 0 :(得分:2)
根据您的代码示例,A
' Enabled
将会打印出来。
当您创建A
时,它对B
一无所知,因此多态,您不能指望它使用其值。这样做,因为如果你有一个同样来自C
的课程A
,它就不知道该使用什么!
另一方面,如果你写了:
public static void Main()
{
A a = new B();
a.PrintThing();
}
你会(正确地)期望它会使用B
覆盖,因为你创建了该类型的实例。
答案 1 :(得分:2)
你可以这样做:
https://dotnetfiddle.net/SOiLni
A in本身对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;
}
}
}
}
答案 2 :(得分:1)
您的代码必须有其他问题。此代码将分别打印“true”和“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();
如果我猜你可能正在创建父类的实例,即使你打算创建子类的实例。