【问题标题】:does Inheritance really hide methods?继承真的隐藏方法吗?
【发布时间】:2009-07-20 05:41:11
【问题描述】:

我收到以下编译器警告:

'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended.    Resources.NET\Resources\Class1.cs   123 20  Resources

对于这个(非常简化的)代码:

public interface IFoo
{
    int GetType();
    string GetDisplayName();
}

public class Foo : IFoo
{
    public int GetType() { return 3; }   *** Warning: points to here (line 123)***
    public string GetDisplayName() { return "Foo"; }
}

注意,我不明白为什么 GetDisplayName() 函数没有收到警告。我显然忽略了一些东西。

我在 Stack Overflow 上搜索了一下,并用谷歌搜索了这个错误,它似乎适用于类继承,而不是接口。我真的很困惑为什么会为接口触发(将其方法定义为虚拟)。

提前感谢您的洞察力。

【问题讨论】:

  • 哇,你们都太不可思议了。 4 分钟内获得 4 个高质量答案!如何选择最佳答案?我认为链接为我做了它,虽然它很接近。再次感谢大家!

标签: c# inheritance interface method-hiding


【解决方案1】:

GetType 方法定义在 System.Object 类上,它是框架所有类的最终基类。

此方法用于在运行时获取当前实例的Type,我认为您不打算覆盖它(您有一个int返回类型)。

我建议你将方法重命名为 GetFooType 或其他名称,或者实现你的接口explicitly 以避免运行时问题。

【讨论】:

    【解决方案2】:

    它指的是您的方法从对象中隐藏GetType,而不是从您的界面中。由于您的类继承了对象并实现了IFoo,并且都提供了GetType 方法,因此通过隐式 实现接口,您将隐藏从对象继承的GetType。如果你仍然希望你的接口方法被调用GetType,你可以在Foo中实现它显式

    int IFoo.GetType()
    {
        return 3;
    }
    

    【讨论】:

      【解决方案3】:

      .NET 中的所有类型都派生自 System.Object。

      System.Object 已经定义了一个名为 GetType 的方法。如果您在您的类中定义了另一个方法“GetType”,并且如果有人创建了您的类的对象,他们将永远无法调用 System.Object 提供的 GetType 方法。这就是您收到“GetType”隐藏 System.Object 中定义的方法的警告的原因。您不会收到 GetDisplayName 的此警告,因为 System.Object(或就此而言任何父类)未定义此方法。

      我建议您将方法名称更改为其他名称,因为 .NET 开发人员通常希望 GetType 方法调用引用 System.Object 实现。

      【讨论】:

        【解决方案4】:

        它不是抱怨你对接口的实现,而是你对已经在“对象”上的 GetType() 的重新实现——Foo 自动从该对象继承。 “对象”没有 GetDisplayName 方法,因此不会引起对该方法的抱怨。如果您真的想隐藏 object.GetType(),请尝试重命名方法或添加“new”修饰符,但不推荐这样做。

        【讨论】:

          【解决方案5】:

          System.Object 类已经有 GetType() 方法

          你应该使用 new 或 override 关键字来解决这个问题

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-18
            • 2015-12-26
            • 1970-01-01
            • 2015-03-26
            • 1970-01-01
            • 2013-06-11
            • 2012-07-28
            • 1970-01-01
            相关资源
            最近更新 更多