假设我们有三个项目:BaseLib(基类库)、DerivedLib(派生类库)和ConsoleApp(控制台应用)。
在BaseLib中,我们定义了一个基类BaseClass
:
// BaseLib.cs
namespace BaseLib
{
public class BaseClass
{
protected internal string SecretData { get; set; }
public BaseClass()
{
SecretData = "Secret data accessible to derived classes and same assembly.";
}
}
}
在DerivedLib中,我们定义了一个从BaseClass
派生的类DerivedClass
:
// DerivedLib.cs
using BaseLib;
namespace DerivedLib
{
public class DerivedClass : BaseLib.BaseClass
{
public DerivedClass()
{
// 因为DerivedClass继承自BaseClass,并且位于不同但引用了BaseLib的程序集中,
// 所以可以访问BaseClass的protected internal成员
Console.WriteLine(SecretData);
}
}
}
在ConsoleApp中,我们实例化DerivedClass
并运行:
// ConsoleApp.cs
using DerivedLib;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var derivedObj = new DerivedClass();
// 注意:我们无法直接访问BaseClass的SecretData字段,
// 因为我们没有权限访问protected internal成员
}
}
}
在这个例子中,DerivedClass
能够访问BaseClass
的protected internal
字段SecretData
,因为它是BaseClass
的派生类,尽管它位于不同的程序集中。但是,ConsoleApp
项目中的代码无法直接访问BaseClass
的SecretData
字段,因为它没有继承关系并且SecretData
不是public
的。