2014-10-27 45 views
2

我正在使用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

+0

你可以发布[MCVE](http://stackoverflow.com/help/mcve)吗? – dcastro 2014-10-27 17:53:28

+0

当然,lemme杜松子酒的小提琴 – Codeman 2014-10-27 17:54:29

+0

@dcastro我添加了一个:) – Codeman 2014-10-27 17:59:05

回答

2

你可以做这样的事情:

https://dotnetfiddle.net/SOiLni

一个在其本身什么都不知道B的实现,所以你必须要访问它的被覆盖的属性实例B的对象。

你拨弄稍微修改后的版本:

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; 
      } 
     } 
    } 
} 
+0

更新了实际代码 – Kritner 2014-10-27 18:06:52

+0

谢谢;现在很好的答案! +1 – BradleyDotNET 2014-10-27 18:07:28

+0

查看:https://dotnetfiddle.net/MpSNti它可能会指向你,我认为你可能会去的方向。 – Kritner 2014-10-27 18:50:28

2

鉴于代码例如,AEnabled将被打印,因为它应该。

当您创建A时,它对B一无所知,因此多态,您不能指望它使用它的值。这使得,因为如果你有一个类C也从A派生,它不知道该用什么!

在另一方面,如果你这样写:

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

你会期望(正确),它会使用B的覆盖,为您创建的类型的实例。

+0

我编辑了我的问题,以便我按照我的意图实例化“B” - 那是我的错误。 – Codeman 2014-10-27 18:05:12

+0

@ Pheonixblade9好吧,我刚刚检查了你的小提琴,并且如预期的那样打印出“假”。你是否期望它在多态属性上使用基类的值? – BradleyDotNET 2014-10-27 18:09:14

+0

是的,这就是我的预期 - 我想我只是橡皮鸭自己:) – Codeman 2014-10-27 18:12:56

1

您必须与您的代码的一些其他问题。如果我猜你可能创建父类的实例,即使你的意图

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

:此代码将打印分别为“真”和“假”:

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; 
     } 
    } 
} 

然后使用这些类是创建子类的实例。

相关问题