Подтвердить что ты не робот

Путаница: внутренняя, защищенная и защищенная внутренняя

Возможный дубликат:
В чем разница между 'protected' и 'protected internal'? В чем разница между Public, Private, Protected и Nothing?

Код указан ниже:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace testanotherlib
{
    public class A
    {
        internal void InternalDisplay()
        {
            Console.WriteLine("Internal Display Method.");
        }

        protected void ProtectedDisplay()
        {
            Console.WriteLine("Protected Display Method.");
        }

        protected internal void ProtectedInternalDisplay()
        {
            Console.WriteLine("ProtectedInternal Display Method.");
        }

        public void PublicDisplay()
        {
            Console.WriteLine("Public Display Method.");
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace testanotherlib
{
    public class B : A
    {
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using testanotherlib;
namespace testlib
{
    public class C:A
    {
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using testlib;
using testanotherlib;

namespace testapp
{
    class Program
    {
        static void Main(string[] args)
        {
            B objB = new B();
            C objC = new C();
        }
    }
}

Я пытаюсь понять разницу между Internal, Protected и Protected Internal. Для этого я создал пример, используя приведенный выше код.

В проекте библиотеки классов testanotherlib у меня есть класс A и класс B. В проекте библиотеки классов testlib у меня есть класс C. Класс программы находится в отдельном консольном приложении. Внутри основного метода класса Program я создал объект для класса B (objB) и класса C (objC). Для objB и и objC доступен только общедоступный метод класса A. Я ожидал, что для класса B будут доступны все методы класса A. Пожалуйста, помогите мне понять это. Если вам нужна какая-либо другая информация о проекте, не стесняйтесь спрашивать меня.

С уважением, Priyank

4b9b3361

Ответ 1

Следующие пять уровней доступности могут быть указаны с помощью модификаторов доступа:

public: доступ не ограничен.

protected: доступ ограничен содержащим классом или типами, производными от содержащего класса.

Внутренний: доступ ограничен текущей сборкой.

protected internal: доступ ограничен текущей сборкой или типами, производными от содержащего класса.

private: доступ ограничен типом содержимого.

Взято непосредственно из библиотеки Microsoft MSDN.

Ответ 2

internal

Видно только в текущей и дружественной сборке.

protected

Видно только внутри классов, наследующих A.

protected internal

Видно внутри классов, наследующих A. А также видно в текущей и дружественной сборке.

Ответ 3

protected методы, и члены могут быть доступны только из другого класса, который происходит от класса, объявляющего проктированный метод.

class A 
{
    protected void Method() {}
}

class B : A
{
    public void Foo()
    {
        Method(); // works!
    }
}

class C 
{
    public void Foo()
    {
        Method(); // won't work, obviously

        var tmp = new A();
        tmp.Method(); // won't work either because its protected
    }
}

internal делает метод видимым только в той же сборке. Для классов в одной и той же сборке метод можно использовать, как и общедоступный. для классов за пределами вашего текущего assebmly его как частного.

Теперь объединение защищенных и внутренних позволяет использовать метод в той же сборке для всех классов в этой сборке. И защищенный делает метод применимым во всех производных классах независимо от того, какая сборка.