首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用new隐藏方法的用例

使用new隐藏方法的用例
EN

Stack Overflow用户
提问于 2010-06-25 21:30:50
回答 1查看 194关注 0票数 4

这或多或少是this post的复制品,但由于我不能编辑它,所以我开始编辑它。你可以随意移动一些东西,然后关闭它。

在new中使用方法隐藏似乎是一个危险的特性,而且在另一个线程中的讨论中,似乎不只是我一个人在寻找有效的用例方面有问题。任何接受Base的方法都不会使用派生的方法。

代码语言:javascript
运行
复制
public class Base
{
    public void Method()
    {
        Console.WriteLine("Base");
    }
}

public class Derived : Base
{
    public new void Method()
    {
        Console.WriteLine("Derived");
    }
}

var derived = new Derived();
derived.Method(); // "Derived"
((Base)derived).Method(); // "Base"

那么,有哪些新的有效用例是难以用其他功能解决的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-25 21:39:03

这个想法是为了尽可能避免问题。

假设您提供了一个库,而我派生自您的一个类。我创建了自己的方法Foo(),并适当地调用它。很好。

现在引入库的第二个版本,并将Foo()方法(具有相同的签名)添加到基类中。现在您的代码将调用Foo(),它有一个特殊的含义...与我的Foo()方法相比,这可能是完全不同的含义。默认行为(以及添加new修饰符的行为)是为了让事情按照它们应该的方式运行:只知道基类的代码将调用您的方法--这很好,因为这就是它们的意思。使用具有我的派生类的编译时类型的表达式的代码将使用我的方法-这很好,因为这也应该是它们的意思。(基本上它只能是我的代码,因为只有我的代码知道我的类。)

通常应该避免它-它可能会导致细微的bug,即更改变量的编译时类型会默默地更改行为……但它是为那种情况而存在的。基本上,向基类添加方法应该尽可能不会破坏派生类。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3118372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档