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

これに対処する最もクリーンな方法は、パブリック インターフェイスとプライベート クラスを使用することです。既存のコードをリファクタリングする場合、これは常にオプションではありません。この変換の苦痛を軽減する簡単な方法の 1 つは、インターフェイスの代わりにパブリック抽象クラスを使用し、静的ファクトリ メソッドを公開することです。

例:

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

class InternalMyClass : MyClass
{ }
于 2009-11-13T14:36:00.267 に答える