2012-06-21 168 views
0

我有一些保護成員的抽象基類的變量,但沒有抽象成員:聲明一個抽象類類型

internal abstract class BaseClass 
{ 

    protected readonly string Var1; 
    protected readonly string Var2; 

    protected BaseClass(string var1, string var2) 
    { 
     Var1 = var1; 
     Var2 = var2; 
    } 

    protected int DoSomething1(string s) 
    { 
    } 
} 

和實現這個基類,並有各自不同的一些具體方法的一些類:

internal sealed class Child1:BaseClass 
{ 
    internal Child1(string var1, string var2) 
     : base(var1, var2) 
    { 
    } 

    internal bool DomeSomethingSpecificForChild1(int i) 
    { 
    } 

} 

現在我有另一個類,我想有BaseClass類型的變量,取決於什麼,我需要的,與兒童型intantiate它。 但是這不起作用,因爲不知道具體的方法。

public class MyClass 
{ 
     private BaseClass myBaseClass; 

    public bool DomeSomethingSpecific(int i) 
    { 
      myBaseClass = new Child1("a","b"); 
      myBaseClass.DomeSomethingSpecificForChild1(i); 
    } 
} 

有沒有一種方法可以完成我想要的功能? 或者我必須在MyClass的方法的內部範圍內聲明我的變量嗎?

public class MyClass 
{ 
     private BaseClass myBaseClass; 

    public bool DomeSomethingSpecific(int i) 
    { 
      var child1 = new Child1("a","b"); 
      myBaseClass.DomeSomethingSpecificForChild1(i); 
    } 
} 

但這種方式我不確定該類實現BaseClass

接口是不是一種選擇,因爲我希望它保持內部的,不公開, 我不想基類被實例化,所以我認爲抽象會在這裏一個不錯的選擇..

+0

您的代碼不會工作爲的是,你必須標記功能虛擬要在子類中重寫,也需要在定義子類中的函數時使用「覆蓋」關鍵字 – MSUH

+0

@MSUH我知道,但事情是我不想重寫任何方法。我已經將每個類的memthods與baseclass中的protected方法放在一起。在孩子班裏,我可以放任何我喜歡的東西。我只是想確保我在「MyClass」中實例化的類確實實現了「BaseClass」。 – Koen

+0

然後你需要檢查 如果(child1是BaseClass){child1.DomeSomethingSpecificForChild1(1);} – MSUH

回答

0
private BaseClass child; 

public bool DomeSomethingSpecific(int i) 
{ 
     var c = {initialization to an instance - e.g. Child1(), Child2(), Child3()..}; 
     if (c is Child1){ 
      ((Child1)c).DomeSomethingSpecificForChild1(i); 
     } 
} 
0

你可能喜歡使用抽象方法:

internal abstract class BaseClass 
{ 

    protected readonly string Var1; 
    protected readonly string Var2; 

    protected BaseClass(string var1, string var2) 
    { 
     Var1 = var1; 
     Var2 = var2; 
    } 

    protected int DoSomething1(string s) 
    { 
    } 

    public abstract bool DoSomethingSpecific(int i); 
} 

然後

internal sealed class Child1:BaseClass 
{ 
    internal Child1(string var1, string var2) 
     : base(var1, var2) 
    { 
    } 

    public override bool DomeSomethingSpecific(int i) 
    { 
    } 

} 
+0

也想到這一點,但每個孩子的名字和方法數量都不一樣,所以讓他們抽象化並不是一種選擇。 – Koen

+0

@Koen這不是一個好主意,因爲如果你爲每個名稱設定不同的名稱,你將需要一堆'if'來嘗試投入所有這些類型來決定要調用什麼。爲什麼這個名字很重要? –

+0

因爲它具有不同的功能。相同的成員是基類中的受保護成員。其他的子類可以是任何東西。我只是希望「MyClass」中的一些結構能強制我在那裏使用的類應該實現BaseClass。 – Koen

0

投子類對象的基類

public class MyClass 
{ 
    public bool DomeSomethingSpecific(int i) 
    { 
      var child1 = new Child1("a","b"); 
      ((myBaseClass)child1).DomeSomethingSpecificForChild1(i); 
    } 
} 
0

顯然,宣佈你,你只能使用由基類暴露的方法基類的實例變量。

要使用特定類的方法,你需要投你的對象,所以:

if(child is Child1) 
{ 
    Child1 c1 = child as Child1 
    if(c1 != null) c1.specificMethod1(); 
} 
if(child is Child2) 
{ 
    Child2 c2 = child as Child2 
    if(c2 != null) c2.specificMethod2(); 
} 
// ...