【问题标题】:Can we create derived public type from private base type in .net?我们可以从 .net 中的私有基类型创建派生的公共类型吗?
【发布时间】:2013-01-08 12:55:56
【问题描述】:
我知道这个问题听起来有些愚蠢,但我有这种情况。
上下文
我正在创建 2 个后台任务(METRO 应用程序、winRT),它们有很多共同点。
现在我想要的是,一个定义通用功能的通用基类,以及从基类派生的 2 个任务。
问题:后台任务应该针对WinMD,在这种模式下,不能创建非密封的公共类。如果我创建密封,我不能从它派生,如果我创建私有,我不能公开派生类型,因为基是私有的。
关注点:实现所需功能的方法有哪些。 (从私有基础派生的公共类型)。一种方法是使用组合(而不是继承)
【问题讨论】:
标签:
c#
.net
oop
microsoft-metro
windows-runtime
【解决方案1】:
你根本做不到。 .NET 不允许您使派生类型比基类型更易于访问。您必须公开基本类型。
请注意,如果您只给它内部构造函数,那么其他代码将无法实例化它或创建自己的派生类型......此时暴露它有什么问题?
编辑:好的,我刚刚重读了这个问题,看到了这个:
无法创建非密封的公共类
所以:
- 您能否将所有所涉及的类型设为内部?
- 你能把它变成一个公共的抽象类吗? (WinMD 允许吗?)
(如果您有任何其他关于 WinMD 允许的文档,那将很有用。)
如果您被允许导出接口,也许您可以将基类和派生类放在内部,但让它们实现公共接口。然后在公共静态类中使用公共静态方法来创建这些内部类型的实例并通过接口返回它们。同样,我不知道这是否被允许 - 如果你有任何关于 WinMD 中允许的文档的链接,这对我们这些没有做过任何 WinRT 开发的人来说很有用。
【解决方案2】:
是的,你可以把它隐藏在派生类中,然后暴露base.Property,即,
new public ScrollBar HorizontalScrollBar
{
get { return base.HorizontalScrollBar; }
}