3

オブジェクト型のスイッチを使用することは、クラス オブジェクトへの保存された参照の共通関数を呼び出す主な方法ですか? 「オブジェクト」値タイプである必要はありません。

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;
             }
         }
     }
}

注: コードは解析されていないため、重大なエラーが発生する可能性があります。

4

4 に答える 4

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();
}
于 2013-07-22T09:23:16.937 に答える
1

その場合、as キーワードを使用して安全なキャスト操作を実行することをお勧めします。

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 配列として宣言する方がさらに良いはずです

于 2013-07-22T09:18:52.757 に答える
1

Stringly」に型付けされたオブジェクト指向コードは非常に悪い考えです。文字列を介してオブジェクトの型を (ほとんど) 知る必要はありません。

「印刷」をこれに変更しConsole.WriteLine、メインをこれに変更するとうまくいきます

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

問題が の配列を使用することに決めている場合object、AlexH が回答しています。

于 2013-07-22T09:21:35.353 に答える
1

よりオブジェクト指向のソリューションを実装する必要があります。オブジェクトで構成される配列を作成する代わりに、MainClass を抽象化し、抽象メソッド 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();
        }
    }
}  
于 2013-07-22T09:21:43.823 に答える