2013-07-22 49 views
3

使用對象類型上的開關真的是調用存儲對類對象的引用的常用函數的主要方法?它不一定是'對象'值類型。c#:調用從對象[]數組中存儲對類對象的引用的常用方法

using System; 

public class MainClass { public void Main() { print "hello world"; } } 
public class SubClassOne : MainClass { } 
public class SubClassTwo : MainClass { } 

public class Storer 
{ 
    public void Main() { 
     object[] objects = new object[2]; 
     objects[0] = new SubClassOne(); 
     objects[1] = new SubClassTwo(); 
     for(i=0;i<2;i++) 
     { 
      switch(objects[i].GetType().ToString()) 
      { 
       case: "SubClassOne": 
        SubClassOne subclass = objects[i]; 
        subclass.Main(); 
        break; 
       case: "SubClassTwo": 
        SubClassTwo subclass = objects[i]; 
        subclass.Main(); //Could probably call after the switch 
        break; 
      } 
     } 
    } 
} 

注意:代碼沒有被解析,所以可能會有嚴重的錯誤。

+1

爲什麼不使用MainClass [] objects = new MainClass [2]'? – wudzik

+0

當它真的存儲MainClass時,我能夠向它添加子類嗎?從未嘗試過。 – Pendrokar

+0

'SubClassTwo'正在擴展'MainClass',所以你可以在不投射的情況下使用它作爲'MainClass'。使用'objects [0] .Main()'是有效的 – wudzik

回答

1

Stringly」類型面向對象的代碼就是這樣的一個bad idea。你(幾乎)不需要通過字符串知道對象的類型。如果問題是你下定決心使用object數組

改變你的「打印」到Console.WriteLine並主要以這工作得很好

MainClass[] stuff = new MainClass[2]; 
    stuff[0] = new SubClassOne(); 
    stuff[1] = new SubClassTwo(); 
    foreach(var item in stuff) 
    { 
     item.Main(); 
    } 

,AlexH已經回答了。

1

在這種情況下,我建議使用as keyword執行安全轉換操作:

using System; 

public class MainClass { public void Main() { print "hello world"; } } 
public class SubClassOne : MainClass { } 
public class SubClassTwo : MainClass { } 

public class Storer 
{ 
    public void Main() { 
    object[] objects = new object[2]; 
    objects[0] = new SubClassOne(); 
    objects[1] = new SubClassTwo(); 
    for(i=0;i<2;i++) 
    { 
     var myMainClass = objects[i] as MainClass; 
     if (myMainClass != null) 
     { 
      myMainClass.Main(); 
     } 
    } 
} 
} 

正如wudzik說應該是更好的申報對象爲一MainClass陣列

+0

你是對的,你可以直接執行操作並檢查結果是否爲空,謝謝 – AlexH

1

你應該實現一個更面向對象的解決方案。而不是創建一個由對象組成的數組,你應該使MainClass抽象並定義一個抽象方法Main。之後,你應該在你的子類中實現Main。

這樣可以換來您的代碼:

using System; 

public abstract class MainClass { public abstract void Main(); } 

public class SubClassOne : MainClass { 
    public override void Main() { print "SubClassOne, hello world"; } 
} 
public class SubClassTwo : MainClass { 
    public override void Main() { print "SubClassTwo, hello world"; } 
} 

public class Storer 
{ 
    public void Main() { 
     MainClass[] objects = new MainClass[2]; 
     objects[0] = new SubClassOne(); 
     objects[1] = new SubClassTwo(); 

     foreach(MainClass mc in objects) 
     { 
      mc.Main(); 
     } 
    } 
} 
1

有一個很好的方式解決的許多方面,取決於:

如果你知道類型中都沒有太多其中:

使用LINQ OfType<>()。欲瞭解更多詳情,請參見MSDN

foreach (var item in objects.OfType<SubClassOne>()) 
{ 
    item.Main(); 
} 

foreach (var item in objects.OfType<SubClassTwo>()) 
{ 
    item.Main(); 
} 

如果有很多種類型,只是介紹了常用的接口

interface ISharedApi 
{ 
    void Main(); 
} 

class SubClassOne : ISharedApi 
class SubClassTwo : ISharedApi 

而實現這一/標記每個類型的,那麼你只需要單迴路:

var objects = new List<ISharedApi>(); 
objects.Add(new SubClassOne()); 
objects.Add(new SubClassTwo()); 

foreach (var item in objects) 
{ 
    item.Main(); 
}