Путаница: внутренняя, защищенная и защищенная внутренняя
Возможный дубликат:
В чем разница между '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
Ответы
Ответ 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 его как частного.
Теперь объединение защищенных и внутренних позволяет использовать метод в той же сборке для всех классов в этой сборке. И защищенный делает метод применимым во всех производных классах независимо от того, какая сборка.