2009-12-23 117 views
0
Public class ClassB : ClassA 
{ 
} 

public class GeneralClass 
{ 
    public ClassA test 
    { 
     get{} 
     set{} 
    } 
} 
public class specificClass :GeneralClass 
{ 
    public ClassB test 
    { 
     get{} 
     set{} 
    } 
} 

正如你可以看到属性测试继承自generalClass的specificClass,但在这里我想将类型更改为ClassB(ClassB:ClassA)。我可以做这样的事吗,所以任何时候我使用specializedClass.test我不需要将它转换为classB?财产继承

编辑1:我忘了提及,现在它给我的警告,测试隐藏继承成员测试。使用新的关键字,如果隐藏是有意的。

+3

我建议清理你的榜样,因为它不会使目前任何意义。我不知道你的目标是什么,因为那 – JustLoren 2009-12-23 13:58:30

+1

我假设'specificClass'应该继承'GeneralClass',在你的例子中情况并非如此! – Vinz 2009-12-23 13:59:44

+0

此外,你已经混淆了属性定义中的类型和名称。它应该是'public ClassA test {get;组; }' – Vinz 2009-12-23 14:01:30

回答

6

当您覆盖方法和属性时,不能修改返回类型。 C#不支持return type covariance

顺便说一句,如果你不需要重写属性,只是想回到铸造某种特定类型的基值,你可以声明new property隐藏基类之一。请注意,它不是返回类型协方差。这只是碰巧具有相同名称不同的属性:

public new ClassB test { 
    get { return base.test as ClassB; } 
    set { base.test = value; } 
} 
0

当overridding方法和属性,你必须使用完全相同的类型为基础的方法/属性,即使它可能是安全的使用子类。您可以使用new关键字隐藏属性,但在基类上调用该属性时不会虚拟调度。

0

Mehrdad Afshari刚刚更新了他的问题,以反映我即将写作的内容。基本上,你要找的是:

public class ClassA 
    { 

    } 

    public class ClassB : ClassA 
    { 

    } 

    public class GeneralClass 
    { 
     public ClassA myClass { get; set; } 
    } 

    public class SpecificClass : GeneralClass 
    { 
     new public ClassB myClass { get; set; } 
    } 

    public myFunction() 
    { 

     var sc = new SpecificClass(); 

     sc.myClass = new ClassB(); 

     Console.WriteLine("sc.GetType() = " + sc.myClass.GetType()); 

     var gc = (GeneralClass)sc; 

     gc.myClass = new ClassA(); 

     Console.WriteLine("gc.GetType() = " + gc.myClass.GetType()); 

     Console.WriteLine("sc.GetType() = " + sc.myClass.GetType()); 
    } 
0

根据你确切的问题,你可以用泛型来解决它。 (但它是一种复杂的)

注:GeneralClass : AbstractGeneralClassSpecificClass : AbstractGeneralClass

您可以:

  • GeneralClass存储实例和AbstractGeneralClass
  • 访问testAsClassASpecificClass如果你有AbstractGeneralClass类型的变量
  • 访问ClassB test如果您有一个类型为的变量
class ClassA { } 
    class ClassB : ClassA { } 

    abstract class AbstractGeneralClass 
    { 
     /* functionality that does not depend on test */ 

     public abstract ClassA testAsClassA { get; } 
    } 

    abstract class AbstractGeneralClass : AbstractGeneralClass where T : ClassA 
    { 
     T myProperty; 
     public T test 
     { 
      get { return myProperty; } 
      set { myProperty = value; } 
     } 

     public override ClassA testAsClassA { get { return myProperty; } } 
    } 

    class GeneralClass : AbstractGeneralClass { } 

    class SpecificClass : AbstractGeneralClass { }