0

我正在用 C# 编写一个程序。我正在尝试做某事,但它并没有达到我的预期。

我有一个接口I,类C1和类C2

C1实现接口IC2继承自C1

接口I有一个名为equals的方法声明,它在C1中实现。在类C2中,也有一个equals方法,它通过检查其他事物来确定相等性来扩展父类(C1)的equals方法。在类C2的 equal 方法中,我使用 base 关键字在 C1 中调用 equals 方法,并使用了一些附加变量来确定相等性。你可以这样想,根据 C1 相等取决于 3 个变量,对于 C2 相等取决于 5 个变量,包括 C1 中的变量。

到目前为止,没有问题。但是,在接受接口I作为参数的方法中,声明如下;

void myMethod(I param1)

当我传递C2实例时,我想在C2中使用equals方法(扩展一个),当我传递C1实例时,我想在C1中使用 equals 方法。但是,程序每次都在C1中使用equals方法,它从不在C2中使用 equals 。我做错了什么,我怎样才能让程序在正确的类中使用equals方法。

谢谢

4

2 回答 2

0

您是否equals在类 C1 中使用关键字 virtual 和equals在 C2 中使用覆盖标记了方法?只有这样,该equals方法才会在 C2 中被覆盖(否则它将是与接口 I 或类 C1 没有任何共同点的新方法)。

public interface I
{
    bool equals(I other);
}

public class C1 : I
{
    public virtual bool equals(I other)
    {
        Console.WriteLine("C1.equals");
        return false;
    }
}
public class C2 : C1
{
    public override bool equals(I other)
    {
        Console.WriteLine("C2.equals");
        return false;
    }
}
于 2013-08-09T16:25:59.833 回答
0

C2 不直接实现您的 equals 方法。如果您想在将 C2 的实例作为接口传递时使用 C2 Equals 方法,则需要将其强制转换为 C2 类型,然后您将能够使用 Equals 的 C2 实现。

//psudocode
void myMethod(I param1)
{
 var obj = param1 as C2;
  if(obj != null)
  //use obj.Equals method which will use the C2 implementation.
  if(obj == null)
  //this is a C1 type and will use C1 equals method via param1.Equals
}
于 2013-08-09T16:15:58.033 回答