C# 当一个类的两个实例被类型化为基类和子类时,测试它们的相等性?
假设我有一个高级界面C# 当一个类的两个实例被类型化为基类和子类时,测试它们的相等性?,c#,casting,equality,C#,Casting,Equality,假设我有一个高级界面IRobot public interface IRobot { Boolean DoAction(object action); } 和两个实现此接口的类 public class WalkingRobot : IRobot { public enum WalkAction { SLOW, FAST }; public new Boolean DoAction(object inAction) { WalkAction ac
IRobot
public interface IRobot
{
Boolean DoAction(object action);
}
和两个实现此接口的类
public class WalkingRobot : IRobot
{
public enum WalkAction { SLOW, FAST };
public new Boolean DoAction(object inAction)
{
WalkAction action = (WalkAction)inAction;
// Does the action based on argument
return true;
}
}
public class TalkingRobot : IRobot
{
public enum TalkAction { ENGLISH, GERMAN };
public new Boolean DoAction(object inAction)
{
TalkAction action = (TalkAction)inAction;
// Does the action based on argument
return true;
}
}
如果我有一个包含这两个类的实例的列表
WalkingRobot walker = new WalkingRobot();
TalkingRobot talker = new TalkingRobot();
List<IRobot> robots = new List<>();
robots.Add(walker);
robots.Add(talker);
除非您没有显示
=
重载,否则您只是在比较两个引用是否相等——这很好。您甚至不需要将waaction
和tAction
转换为object
,因为您可以使用隐式转换:
foreach(IRobot robot in robots)
{
if (robot == walker)
{
robot.DoAction(wAction);
}
else if (robot == talker)
{
robot.DoAction(tAction);
}
}
这是可行的,但总的来说,这在很大程度上不是一个伟大的面向对象设计。你不是以同样的方式的机器人,每个机器人都必须将他们的动作投射到正确的类型
如果这只是一个关于将对象与
==
进行比较的问题,那没关系,但我会在设计方面避开其余的代码。您可以使用as
或is
操作符,但是,这首先违背了使用接口的目的。为什么要在DoAction
方法实现中指定new
?robot==walker
将实现引用相等。这似乎对这个例子有效。你试过了吗?如果是这样,它做了你想要的吗?@JonSkeet我可能会感到困惑。在类中实现接口方法时,VS给了我某种警告。我可能添加错了。对不起,我刚刚在我给出的示例代码中发现了我的错误。我的意思不是在那里指定类型,而是检查类本身的实例是否相等。我已经对OP进行了编辑。//我想检查给定的IRobot机器人
是否是walker
或talker
。谢谢,是的。我试图摆脱这种设计。基本上,我想传递IRobot
s并调用它们的DoAction
s并提供参数。但是,如果每个参数都是不同的类型,这似乎很困难?这有道理吗?@KDecker:这很棘手,因为我们不知道你在更广泛的背景下想要实现什么。您可能希望将IRobot的动作参数类型设置为泛型。。。或者你可能不会。这取决于上下文。嗯,这实际上可能就行了。我没想到上下文太多。//谢谢你的帮助。
foreach(IRobot robot in robots)
{
if (robot == walker)
{
robot.DoAction(wAction);
}
else if (robot == talker)
{
robot.DoAction(tAction);
}
}