你选择哪个,protected 还是 internal?

8
如果我有一个类,其中一个方法我希望它是protectedinternal的。 我希望只有程序集中的派生类能够调用它。
由于protected internal的含义是protected或者internal,你必须做出选择。在这种情况下,你会选择protected还是internal
5个回答

6
个人而言,我会选择使用protected。如果你的程序集中的子类可以调用该方法,为什么另一个程序集中的子类不能呢?也许你可以将功能重构为一个单独的(internal)类。
你真的需要客观地思考该方法的目的。对我来说,内部可访问性几乎总是感觉不对。主要是因为我在尝试从.NET框架中的控件或类派生时遇到了障碍,因为有人决定将类或方法标记为internal。原始作者从未注意到,没有访问该方法使得实现子类变得更加困难。
编辑:
澄清一下,类的内部可访问性非常有用,我并不是暗示内部可访问性总体上是不好的。我的观点是,在一个公共类中使用内部方法似乎不太合适。一个正确设计的基类不应该给同一程序集中的派生类带来不公平的优势。

如果您在程序集类上进行反射,但子类不会被反射(因为它在程序集之外),那么这种方法就无法正常工作了,您怎么看? - brickner
1
@Kobi,你从来不用属性吗? - brickner
你做错了。如果你正在编写一个API,并且创建的类仅适用于程序集的内部(辅助/实用类),那么你绝对不希望用户从这些类派生。如果你让他们这样做,他们会编写添加依赖项到内部实现的代码(使其在未来无法更改而激怒你的用户)。我重申一遍,所有你没有明确为用户访问而设计的东西都应该标记为internal或private。 - Evan Plaice
不这样做只会给用户更多的方式来以意外的方式黑掉你的库,使其更难以支持。此外,为了有效地记录API,在理想情况下,所有标记为public的内容都应该得到适当的注释。.NET框架的某些部分不提供访问权限是有很好的原因的。 - Evan Plaice
@Evan,我对内部类很满意。我经常使用它们。在OP的示例中,他暗示了一个公共未密封类,其中包含一个假设的受保护+内部方法。如果同一程序集中的子类可以访问该方法,那么程序集外的子类也应该可以访问。 - Josh
显示剩余2条评论

5
我希望只有程序集中的派生类才能调用它。
那么,您有两个选择。您可以将其设为受保护的,并且每当您的客户扩展您的类并调用您的方法时,如果您发现此情况,您可以写一封严厉的信告诉他们请停止这样做。或者,您可以将其设置为内部的,并对同事的代码进行代码审查,以确保他们不使用他们不应该使用的方法。
我猜后者是更便宜、更容易做的事情。我会将其设为内部的。

3
可能还有第三个选择。OP可以将整个类设为internal,这样方法上的protected访问修饰符就可以实现所需的行为。程序集外的代码可以通过公共接口访问该类的功能。这可能足以实现OP想要的行为。当然,缺点是程序集外的所有继承将被禁止...但OP并没有明确表明这是一个要求。 - LBushkin

3

我认为正确的选择是internal。这样你可以保护你程序集之外的人不调用此方法,同时也只需要小心地从派生类中调用此方法。在你编写的程序集中小心谨慎要比希望其他人使用时小心谨慎更容易。


2
更多信息请参见:http://blogs.msdn.com/ericlippert/archive/2008/04/24/why-can-t-i-access-a-protected-member-from-a-derived-class-part-three.aspx - Dean Harding

1

protected internal解释为protectedinternal是一个非常奇怪的决定。对于这种情况,我会使用internal。原因是如果封装被破坏,我宁愿是我自己犯错,而不是其他人。


0

我认为答案取决于你的需求。如果我是你,我会这样做:

    public class YourClass
    {
       protected class InnerClass
       {
           internal void YourMethod()
           {
               // Your Code
           }
       }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接