【问题标题】:Class design in OOPS protected Internal c#OOPS 中的类设计受保护的内部 c#
【发布时间】:2014-05-21 06:17:07
【问题描述】:

当我们使用受保护的内部任何类的任何数据成员时,我们知道该数据成员可以在同一个程序集中使用,但我不知道受保护的内部可以从其他程序集中使用。从这里我知道了Have you ever seen design with reasonable usage of protected internal access modifier?

汇编1中的代码

public class A
    {
        internal protected virtual void YoBusiness()
        {
            //do something
        }

        public void test() { }
    }


    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! 
        }
    }


    class D : A
    {  // derived across assemblies
        internal protected override void YoBusiness()
        {
            // Hey thanks other guy, I can provide a new implementation. 
        }
    }

assembly2 中的代码

class C : A
    {  // derived across assemblies
        public C()
        {
            YoBusiness();
        }

        protected override void YoBusiness()
        {
            // Hey thanks other guy, I can provide a new implementation. 
        }
    }

我一直都知道受保护的内部可以在同一个程序集中使用,但今天知道并惊讶于其他程序集的任何类也可以覆盖该方法......它是如何成为可能的?

如果我希望只有数据成员可以被覆盖或从同一个程序集中调用,那么我需要做什么......请讨论。谢谢

【问题讨论】:

标签: c# oop protected internal


【解决方案1】:

如果您只希望该方法可被同一程序集覆盖或调用,则只需将该方法标记为internal

您可以找到有关 C# 访问修饰符 here 的更多信息。

举个例子说明为什么你可能会使用protected internal,假设我们有一个名为Job 的基类,你可以从它派生出一些功能。运行作业的框架将为您提供Context,其中包含有关作业应如何运行的信息。只有框架可以设置此上下文,但作业应该能够访问它。你可以这样设计你的课程:

abstract class Job
{
  public abstract void Run()

  protected internal Context RunContext{get; internal set}
}

现在,只有您的框架可以设置上下文,只要它在同一个程序集中。您的派生类只能获取上下文,前提是它们位于不同的程序集中。

【讨论】:

  • 任何人都可以给出一个现实生活中人们必须使用受保护内部的情况。我在谷歌上搜索现实生活中的示例代码和情况。
  • 你能告诉我人们何时将受保护的内部用于他们的类构造函数吗?
【解决方案2】:

protected internal 并不意味着您(以及包括我自己在内的许多其他开发人员)认为的那样。这并不意味着protected internal,它意味着protected internal。有了这些知识,我们知道子类化 protected internal 成员的类将对该成员具有可见性,而另一个程序集中的类则不会。该成员在声明它的程序集中的任何位置也可见,无论访问该成员的类是否是原始类的子类。

【讨论】:

    【解决方案3】:

    这是因为protected internal 应该被解读为“受保护的内部”(即,对同一程序集中的任何类可见任何从A 派生的类无论其位置如何),而不是“受保护的内部”。

    来自MSDN

    类型或成员可以被声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在派生自声明受保护内部元素的类的类声明中进行,并且必须通过派生类类型的实例进行。


    我希望只有数据成员可以被覆盖或从同一个程序集调用然后我需要做什么

    然后将其标记为internalvirtual

    【讨论】:

    • 任何人都可以给出一个现实生活中人们必须使用受保护内部的情况。我在谷歌上搜索现实生活中的示例代码和情况。
    • @Thomas,你能想象either protected or internal 可能有用的场景吗?如果是这样,那么想象一个你想要两者都受益的场景似乎并不难。
    • 你能告诉我人们何时将受保护的内部用于他们的类构造函数吗?
    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 2011-01-02
    • 2011-01-23
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2016-06-19
    相关资源
    最近更新 更多