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

JAs*_*son 9 c# inheritance

这是我的情况.在Java中,我可以在base/super类中将方法标记为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
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:不重复.

所有答案似乎都暗示,不可能阻止方法在派生类中隐藏/隐藏.在将一些旧的Java代码迁移到C#时,这一点变得很明显.Java中的最终方法不允许任何人在任何派生类中使用相同的方法签名.虽然在大多数场景中C#允许在派生类中使用相同签名的方法,但如果有必要,可以防止这种行为.

Ree*_*sey 10

//如何防止以下情况

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

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

这意味着,如果构建的API,您的API MyClass将始终MyMethod在实例传递到您的方法时调用.


编辑以回应评论:

如果你担心人们通常会对你的课程进行小类化,那么你唯一真正的选择就是密封你的课程:

public sealed class MyClass
{
Run Code Online (Sandbox Code Playgroud)

这将阻止人们完全创建子类.但是,如果您希望允许人们从您的班级派生,则无法阻止他们将您的方法隐藏在他们的班级中.

  • @JAson你的情况的前提是有人从不受信任的恶意来源运行代码.当你处于那种情况时,你已经输了.正确的发展并不是让你自己处于这个位置. (4认同)