2015-04-07 69 views
0

我有以下設置:強行關閉的亞型多態性對象實例化

public abstract class Parent { 
    // logic for class 
    public virtual int Value {get;set;} 
    public Parent(){} 
} 

public class Child1 : Parent { 
    // child specific logic here 
    public Child1() : base() { 
     base.Value = 4; 
    } 
} 

public class Child2 : Parent { 
    // child specific logic here 
    public Child2() : base() { 
     base.Value = 6; 
    } 
} 

public class RunMe { 
    Parent p; 

    public Parent instantiateObject(string s) { 
     switch(s) { 
      case "child1": 
       return new Child1(); 
      break; 
      default: 
      case "child2": 
       return new Child2(); 
      break; 
     } 
    } 

    public RunMe() { 
     p = instantiateObject("child1"); 
    } 
} 

當我運行類似下面的代碼,團結力關閉。我知道C#支持子類型多態,所以我不確定爲什麼這不起作用。它沒什麼特別或先進的;所以我非常困惑。無恥的承認,我在Java陣營,我(不)有意識地嘗試將我的Java範式適合C#範式。我沒有正確使用它,或者我不理解C#中的子類型是如何工作的?

回答

0

看來,使用

base.Value = 4 

在被定義爲一個virtualabstract內部的訪問會引起問題。由於我對C#更深奧的基礎不是很熟悉,我並不真正瞭解或理解爲什麼會出現這種情況。但改變的代碼看起來是這樣工作的:

public abstract class Parent { 
    // logic for class 
    public int Value {get;set;} 
    public Parent(){} 
} 

public class Child1 : Parent { 
    // child specific logic here 
    public Child1() : base() { 
     base.Value = 4; 
    } 
} 

public class Child2 : Parent { 
    // child specific logic here 
    public Child2() : base() { 
     base.Value = 6; 
    } 
} 

public class RunMe { 
    Parent p; 

    public Parent instantiateObject(string s) { 
     switch(s) { 
      case "child1": 
       return new Child1(); 
      break; 
      default: 
      case "child2": 
       return new Child2(); 
      break; 
     } 
    } 

    public RunMe() { 
     p = instantiateObject("child1"); 
    } 
} 

通知我刪除從我訪問的virtual關鍵字在我的抽象類Parent

0

您的會員名稱「RunMe」與您的班級「RunMe」相同。你可以使用「邵仁枚」作爲您的類的構造函數:

public RunMe() { 

至於你的子打字,我看沒有錯,你有它執行的方式。它應該像你所描述的那樣工作。

+0

當然,我明白,這'邵仁枚()'是類的構造函數。但是,當我嘗試這樣做時,與此部隊相同的我的實現會關閉Unity3d環境。 – lilott8

+0

您的構造函數RunMe的返回值爲「void」。我之前沒有看過這個語法,你的構造函數實際上是返回一個對象引用,所以它不應該是無效的。您是否收到任何其他錯誤?你的程序是否編譯? – njack

+0

哈哈,我無意中添加了空白。顯然,我沒有對此進行校對。它已經改變了。 – lilott8