如何阻止新修饰符?

时间:2012-02-17 15:56:00

标签: c# properties override new-operator

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

private int _threadHostID = 0;
    public int ThreadHostID
    {
        get
        {
            if (_threadHostID == 0)
            {
                _threadHostID = ThreadQueue.RequestHostID();
            }
            return _threadHostID;
        }
    }

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

Edit2:它不是虚拟的或覆盖其他任何内容所以请不要sealed

5 个答案:

答案 0 :(得分:9)

首先关闭:“覆盖”是指虚拟覆盖。您正在讨论创建隐藏方法,而不是覆盖方法。

  

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

你可以自由地想要这样,但是你将不得不学会忍受不能得到你想要的东西。

  

我认为没有任何理由让任何人隐藏它。

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

如果没有理由让某人隐藏或覆盖您的方法,那么没人会。如果某人隐藏或覆盖您的方法的原因,那么您告诉他们不是谁?你提供基类;你是派生类作者的 servant ,而不是他们的 master

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

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

答案 1 :(得分:8)

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

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

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

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

答案 2 :(得分:2)

我认为你不应该担心这一点。如果你不把它写成虚拟的那么你就明确表示它不是要被覆盖的,事实上如果你要覆盖它就会收到警告(没有“new”修饰符):

Warning: [...] hides inherited member [...].
Use the new keyword if hiding was intended

如果你有这种恐惧,你应该担心你在非密封课上写的任何方法。所以你的工作就是确保你的类的设计是一致的和清晰的,如果有人想要继承它,那么就不要愚蠢到重新定义非虚拟属性/方法。你不能完全保护自己免受别人的愚蠢:)。

答案 3 :(得分:0)

据我所知,你显然不能在房产层面做到这一点。但是,如果你密封了班级:

public class Base
{
  public int ID { get; set; } 
}

public sealed class Child : Base
{
  /// blah
}

然后......

public class Grandchild : Child
{ 
  public int ID { get; set; } 
}

会在类定义上引发错误,因此使用new甚至不起作用。

不是您问题的确切解决方案,但它确实可以阻止他人扩展或干扰您的API。

答案 4 :(得分:0)

如果有人确实提出了“新”实施,那真的很重要吗?我假设你总是在使用该属性的任何代码中引用基类,因为它是声明它的地方,因为它不是覆盖或虚拟,它不会多态调用到'新'实现。