如何在更高级别中使用重写属性值?

时间:2014-10-27 17:50:41

标签: c# oop inheritance inversion-of-control

我使用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;
            }
        }
    }
}

Here's a Dot Net Fiddle demonstrating my problem

3 个答案:

答案 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();

如果我猜你可能正在创建父类的实例,即使你打算创建子类的实例。