18

C#基本クラスをコンパイル先のライブラリアセンブリ内でのみアクセス可能にし、それを継承する他のサブクラスをパブリックにすることは可能ですか?

例えば:

using System.IO;

class BaseOutput: Stream           // Hidden base class
{
    protected BaseOutput(Stream o)
    { ... }

    ...lots of common methods...
}

public class MyOutput: BaseOutput  // Public subclass
{
    public BaseOutput(Stream o):
        base(o)
    { ... }

    public override int Write(int b)
    { ... }
}

ここでは、ライブラリのクライアントがクラスにアクセスできないようにしたいのですBaseOutputが、サブクラスMyOutputを完全に公開できるようにします。C#では基本クラスがサブクラスよりも制限されたアクセスを許可されていないことは知っていますが、同じ効果を達成するための他の合法的な方法はありますか?

アップデート

この特定のライブラリに対する私の解決策は、基本クラスpublicとを作成し、 「この基本クラスを直接使用しないでください」abstractで文書化することです。また、基本クラスのコンストラクターを作成します。これにより、外部クライアントがクラスを使用または継承するのを効果的に防ぐことができます。internal

(他のオブジェクト指向言語では基本クラスを非表示にできるので、残念です。)

4

3 に答える 3

14

残念ながら違います。内部クラスまたはプライベートクラスからパブリッククラスを派生させることはできません。

基本クラスを公開するか、類似するすべてのクラスのすべてのメソッドを宣言する必要があります。すべてのメソッドを再度宣言するルートに進む場合は、実際に実装されているヘルパークラスを作成すると便利です。それでも、それはかなりの定型文です。

于 2012-06-01T22:32:54.427 に答える
5

ファサードなどのパターンを考えてみましょう。それが彼らの目的です。直接の継承では、必要なことを達成できるとは思いません。

于 2012-06-01T22:33:03.277 に答える
1

「多くの一般的なメソッド」が実行していることに応じて、内部拡張メソッドを使用してその一部を実現できます。

internal static class MyStreamExtensions
{
   internal static int UsefulOne(this Stream stream)
   {
     return 42; 
   }
}   

別のアプローチは、コンストラクターを内部にして、そのクラスからの意図しない派生を防ぐことです。

public class BaseOutput: Stream
{
    internal BaseOutput(Stream o)
    { ... }

    ...lots of common methods...
}

これにより、階層内の「実際には表示されない」中間クラスと比較して、コードがより理解しやすくなります。

于 2012-06-01T23:03:46.670 に答える