gpt4 book ai didi

C#防止派生类中的new修饰符隐藏基类方法

转载 作者:太空狗 更新时间:2023-10-29 17:43:26 25 4
gpt4 key购买 nike

这是我的情况。在 Java 中,我可以在基类/父类(super class)中将方法标记为 final,派生类无法屏蔽具有相同签名的方法。然而,在 C# 中,new 关键字允许继承我的类的人创建具有相同签名的方法。

请参阅下面的示例。我需要将 orignal.MyClass 公开,所以请不要建议将其作为答案。这似乎是从 Java 迁移到 C# 时丢失的功能:

public class orignal.MyClass{
public void MyMethod()
{
// Do something
}
}

class fake.MyClass: orignal.MyClass {
// How to prevent the following
public new void MyMethod()
{
// Do something different
}
}

编辑:不是重复的。

所有答案似乎都表明,不可能阻止方法在派生类中被隐藏/隐藏。在将一些旧的 Java 代码迁移到 C# 时,这一点变得很明显。 Java 中的 final方法不允许任何人在任何派生类中使用相同的方法签名。虽然在大多数情况下,C# 允许在派生类中使用具有相同签名的方法是很好的,但如果有必要,防止这种行为会很好。

最佳答案

// How to prevent the following

没有办法阻止这种情况。这是语言允许的。

请注意,在实践中,这很少重要。如果您希望您的基类被用作您的类,您的方法仍将被调用。使用 new 仅在从声明为 DerivedClass 的变量中使用 DerivedClass 时隐藏该方法。

这意味着您的 API,如果围绕 MyClass 构建,当实例被传递到您的方法中时,将始终调用 MyMethod


根据评论进行编辑:

如果您担心人们通常会继承您的类,那么您唯一真正的选择就是密封您的类:

public sealed class MyClass
{

这将阻止人们完全创建子类。但是,如果您想让人们从您的类派生,就没有办法阻止他们将您的方法隐藏在他们的类中。

关于C#防止派生类中的new修饰符隐藏基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18113099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com