基于实例类型调用正确方法

时间:2013-08-09 16:02:25

标签: c# inheritance overloading

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

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

C1 实现了界面 C2 继承自 C1

界面有一个名为等于的方法声明,它在 C1 中实现。在类 C2 中,还有一个等于方法,它通过检查其他内容来确定相等性来扩展父类(C1)等于方法。在类 C2 的等于方法中,我使用base关键字在C1中调用equals方法,并且我使用了一些额外的变量来决定相等性。您可以认为它如下,根据C1等式取决于3个变量而对于C2等式取决于5个变量,包括C1中的变量。

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

void myMethod(I param1)

当我通过 C2 实例时,我想在 C2 (扩展名为1)中使用等于方法,当我通过 C1时实例我想在 C1 中使用equals方法。但是,程序每次在 C1 中使用等于方法时,它从不在 C2 中使用等号。我做错了什么,如何使程序在正确的类中使用equals方法。

由于

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

您是否在C1类中使用关键字virtual标记了方法equals,在C2中使用覆盖标记equals?只有这样才能在C2中覆盖equals方法(否则它将是与接口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;
    }
}