【问题标题】:Calling Correct Method Based on Instance Type根据实例类型调用正确的方法
【发布时间】:2013-08-09 16:02:24
【问题描述】:

我正在用 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方法。

谢谢

【问题讨论】:

  • 你能发布你的类和接口的简化代码吗?

标签: c# inheritance overloading


【解决方案1】:

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
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多