当我们使用受保护的内部任何类的任何数据成员时,我们知道数据成员可以在同一个程序集中使用但我不知道可以从其他程序集使用受保护的内部。从这里我开始了解Have you ever seen design with reasonable usage of protected internal access modifier?
assembly1 中的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.
}
}
我总是知道受保护的内部可以在同一个程序集中使用但是今天知道并且惊讶于来自其他程序集的任何类也可以覆盖该方法......它是如何实现的?
如果我想只有数据成员可以覆盖或从同一个程序集调用那么我需要做什么......请讨论。感谢
答案 0 :(得分:3)
如果您只希望方法可以从同一个程序集中覆盖或调用,那么只需将该方法标记为internal
。
您可以在C#访问修饰符here找到更多信息。
有关您可能使用protected internal
的原因的示例,我们假设我们有一个名为Job
的基类,您可以从中添加一些功能。运行该作业的框架将为您提供Context
,其中包含有关作业应如何运行的信息。只有框架可以设置此上下文,但作业应该能够访问它。你可以像这样设计你的课程:
abstract class Job
{
public abstract void Run()
protected internal Context RunContext{get; internal set}
}
现在,只有你的框架可以设置上下文,只要它在同一个程序集中。您的派生类只能获取上下文,假设它们位于不同的程序集中。
答案 1 :(得分:2)
这是因为protected internal
应该被理解为“受保护的或内部”(即,同一个程序集中的任何类都可见或来自{的任何类{1}}无论其位置如何),而不是“受保护的和内部”。
来自MSDN:
类型或成员可以由声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在一个类声明中进行,该声明派生自声明受保护的内部元素的类,并且它必须通过派生类类型的实例进行。
我想只有数据成员可以覆盖或从同一个程序集调用然后我需要做什么
然后将其标记为A
和internal
。
答案 2 :(得分:0)
protected internal
并不代表你(包括我自己在内的许多其他开发者)认为它的作用。这并不意味着protected
和 internal
,这意味着protected
或 internal
。有了这些知识,我们知道子类protected internal
成员的类将具有该成员的可见性,而另一个程序集中的类则不会。无论访问成员的类是否归类于原始类,该成员在声明的程序集中的任何位置也是可见的。