我正在用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方法。
由于
答案 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;
}
}