Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当一个类的两个实例被类型化为基类和子类时,测试它们的相等性?_C#_Casting_Equality - Fatal编程技术网

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