您是否曾见过合理使用受保护的内部访问修饰符的设计?

Xor*_*rty 15 c# access-modifiers

我没有,但我不说没有.

所有阅读此内容的C#开发人员可能都知道内部受保护的内容以及何时使用它.我的问题很简单:您是否真的使用过它,或者使用受保护的内部访问修饰符处理成功设计的项目?如果是的话,请分享您的知识并发布好样本,我终于可以欣赏这个棘手的修饰符的巧妙使用.

//我相信这不是主观的,我实际上是在寻求答案;-)

Joh*_*n K 6

是的,在继承情况下,只要允许虚拟或抽象类成员以"友好"/可信方式由同一程序集(内部)中的其他类直接访问,但该成员可以被外部派生类覆盖组件(通过保护).

此组合修饰符允许程序集完全信任其自己的内容和内部用法(这不是异常),同时将其中一些成员公开给其他程序集的正常继承派生模型.

没有一个修饰符可以做到这一点.

或者考虑相反的情况:

  • 如果您使用protected,则同一程序集内的其他类无法访问该成员.

  • 如果您使用内部,那么派生类(在其他程序集中)不能覆盖该方法.

Assembly1.dll

// ------ Assembly file 1 .dll --------

// Allow my friends (internal) and derived classes (protected) to do this. 
public class A {
    internal protected virtual void YoBusiness() {
        //do something
    }
}


class B { // not a derived class - just composites an instance of A
    public B() {
        A a = new A();
        a.YoBusiness(); // Thanks friend for the access! 
    }
}
Run Code Online (Sandbox Code Playgroud)

Assembly2.dll

// ------ Assembly file 2 .dll --------

class C : A {  // derived across assemblies
    protected override void YoBusiness() {
        // Hey thanks other guy, I can provide a new implementation. 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这描述了`protected internal`*是*,但没有描述它的实际用途. (4认同)

Ale*_* Lo 6

我相信你能想到一些例子,但在C#开发的五年中,我没有看到它的好例子.John K的例子很好地说明了修饰符的用途,但我认为导致这种情况的要求是有问题的.在John K的例子中,该类在程序集中具有"友好"访问权限,并且通常这是麻烦,因为这些类可能是"询问"而不是"告诉"(编程不礼貌,最好告诉而不是问).在什么情况下你有一个有用的可扩展类,朋友可以调用方法,但其他人不能?

另一个用途是测试访问(IE希望它受到保护,但内部因此你的程序集级别测试可以调用它).这也是一个麻烦的情况 - 当你将内容暴露在内部进行测试时,我认为这是依赖注入通常可以处理的设计气味.