在对象类型上使用开关真的是调用存储的类对象引用的常用函数的主要方法吗?它不一定是'对象'值类型。
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;
}
}
}
}
注意:代码未解析,因此可能存在严重错误。
答案 0 :(得分: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数组
会更好答案 1 :(得分:1)
“Stringly”类型化面向对象的代码是bad idea。你(几乎)永远不需要通过字符串知道对象的类型。
将“打印”更改为Console.WriteLine
,将主要内容更改为
MainClass[] stuff = new MainClass[2];
stuff[0] = new SubClassOne();
stuff[1] = new SubClassTwo();
foreach(var item in stuff)
{
item.Main();
}
如果问题是您决定使用object
数组,AlexH已回答。
答案 2 :(得分: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();
}
}
}
答案 3 :(得分: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();
}