5

这个问题类似于c# 内部抽象类,如何在外部隐藏使用,但我的动机不同。这是场景

我从以下内容开始:

internal class InternalTypeA {...}

public class PublicClass
{
   private readonly InternalTypeA _fieldA;

   ...
}

上面编译得很好。但后来我决定我应该提取一个基类并尝试编写以下内容:

public abstract class PublicBaseClass
{
   protected readonly InternalTypeA _fieldA;

   ...
}

因此问题是,受保护的成员在程序集外部可见,但属于内部类型,因此无法编译。

手头的问题是我如何(或者我可以?)告诉编译器只有与 PublicBaseClass 相同的程序集中的公共类可以从它继承,因此 _fieldA 不会暴露在程序集之外?

还是有另一种方法来做我想做的事情,拥有一个公共超类和一组公共基类,它们都在同一个程序集中,并在它们的公共(“受保护”)代码中使用该程序集的内部类型?

到目前为止,我唯一的想法是:

public abstract class PublicBaseClass
{
   private readonly InternalTypeA _fieldA;

   protected object FieldA { get { return _fieldA; } }

   ...
}

public class SubClass1 : PublicBaseClass
{
    private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } } 
}

public class SubClass2 : PublicBaseClass
{
    private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } } 
}

但那是丑陋的!

4

2 回答 2

5

CLR 提供了 FamilyAndAssembly 可访问性,可以满足您的需求,但 C# 中没有使用它的语法。

解决方法是将变量字段设置为内部,并且您必须相信程序集中的代码不会不恰当地访问它。

您还可以将 PublicBaseClass 的构造函数设为内部,这样只有您的程序集才能实例化它。这样,只有你的类可以继承它(即使类本身是公共的)

于 2009-11-13T13:44:28.077 回答
0

处理这个问题的最简洁的方法是使用公共接口和私有类。如果您重构现有代码,这并不总是一种选择。减轻这种转换痛苦的一种简单方法是使用公共抽象类而不是接口并公开静态工厂方法。

例子:

public abstract class MyClass
{
    public static MyClass New()
    { return new InternalMyClass(); }
}

class InternalMyClass : MyClass
{ }
于 2009-11-13T14:36:00.267 回答