如何阻止新修饰符?

sco*_*art 4 c# overriding properties new-operator

我在基类中有一个属性,我不想因为任何原因而被覆盖.它为类分配一个ID,以便与我创建的ThreadQueue一起使用.我认为没有任何理由让任何人覆盖它.我想知道如何阻止任何人试图覆盖它而不改变它的修饰符.

private int _threadHostID = 0;
    public int ThreadHostID
    {
        get
        {
            if (_threadHostID == 0)
            {
                _threadHostID = ThreadQueue.RequestHostID();
            }
            return _threadHostID;
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:完全忘记了语言:C#.

编辑2:它不是虚拟的或覆盖其他任何东西所以请不要sealed.

Eri*_*ert 9

首先:"Overriding"是指虚拟覆盖.您正在谈论创建隐藏方法,而不是重写方法.

我在基类中有一个我不想隐藏的属性

你可以自由地想要那个,但是你将不得不学会生活在没有得到你想要的东西的失望中.

我认为任何人都没有理由隐藏它.

那会不会有问题,会吗?如果没有人能可能隐藏它,那么他们将不会隐藏它.你基本上是在说"我有一个对任何人都没有价值的对象;我如何防止有人偷窃它?" 好吧,如果它没有价值,那么没有人会想要偷它,那你为什么要花钱买保险箱以保护一开始没有人想偷的东西呢?

如果没有人隐藏或覆盖你的方法,那么没人会.如果有人来隐藏或覆盖您的方法的原因,那么你是谁告诉他们不要?你提供基类; 你是派生类作者的仆人,而不是他们的主人.

现在,有时候作为一个好的仆人意味着建立一个抵制滥用,强大,价格合理的东西.例如,我鼓励人们建立密封课程.设计安全,健壮,可继承的类以满足继承者的实际需求是昂贵困难的.

但是,如果您要创建一个为继承而设计的健壮的未密封基类,为什么要尝试阻止派生类作者隐藏,如果他们有理由这样做?它不可能伤害基类.它可能受伤的唯一人是派生类的用户,而那些人是派生类作者的问题,而不是你的.


Ada*_*rth 8

没有办法阻止成员隐藏.如果你没有使它成为虚拟或抽象,那么派生类无论如何都不能正确地覆盖它,隐藏不是多态的.

如果派生类使用new运算符隐藏它,那么它们会为自己打开问题,因为任何决定使用对基类的引用的代码都不会触及派生成员.所以基本上,利用类型层次结构的"基类"的所有代码都将绕过所有隐藏的成员.

sealed关键字仅在派生类型覆盖基类型并且不希望它被进一步覆盖时才有效...不确定它如何与new运算符一起使用.最有可能隐藏成员隐藏,但仍然会有相同的直接类型问题.

你的任务是通过不使方法成为虚拟或抽象来完成的,如果一个人想要隐藏成员,那么他们就会因为决定滥用设计而导致任何破坏.