2009-12-23 164 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 { }