7

私は次のことを達成する方法があるかどうか疑問に思いました:

私のプロジェクトでは、インターフェースを定義しました。たとえば、IFruitです。このインターフェイスには、パブリックメソッドGetName()があります。また、IFruitを実装し、GetAppleType()などの他のメソッドを公開するインターフェイスIAppleを宣言します。IBanana、ICherryなどの果物は他にもあります。

さて、外側では、IFruit自体ではなく、実際のフルーツの実装のみを使用できるようにしたいと思います。ただし、継承されたインターフェイスは「基本クラスにアクセスしにくいため実装できない」と表示されるため、IFruitインターフェイスをプライベートまたは内部として宣言することはできません。

私はこれが抽象的な実装で可能であることを知っていますが、この場合はオプションではありません。私は本当にインターフェースを使用する必要があります。そのようなオプションはありますか?

更新 私の例にはいくつかの説明が必要だと思います:)私はMEFを使用してインターフェース実装をロードします。ロードされたコレクションは、IApple、IBanana、ICherryなどに基づいています。しかし、IFruit自体は役に立たないため、そのインターフェイスのみに基づくクラスを使用することはできません。そこで私は、他の開発者が自分のクラスがロードされる(ロードされない)と考えて、IFruitだけを実装しないようにする方法を探していました。つまり、基本的には次のようになります。


internal interface IFruit
{
  public string GetName();
}

public interface IApple : IFruit { public decimal GetDiameter(); }

public interface IBanana : IFruit { public decimal GetLenght(); }

ただし、ベースインターフェイスにアクセスしにくいため、コンパイルされません。

4

3 に答える 3

6

これが意図せずに発生しないことを保証できる1つの方法はIFruit internal、アセンブリを作成してから、アダプターを使用してタイプを適切にラップすることです。

public interface IApple { string GetName(); }
public interface IBanana { string GetName(); }

internal interface IFruit { string GetName(); }

class FruitAdaptor: IFruit
{
    public FruitAdaptor(string name) { this.name = name; }
    private string name;
    public string GetName() { return name; }
}

// convenience methods for fruit:
static class IFruitExtensions
{
    public static IFruit AsFruit(this IBanana banana)
    {
        return new FruitAdaptor(banana.GetName());
    }

    public static IFruit AsFruit(this IApple apple)
    {
        return new FruitAdaptor(apple.GetName());
    }
}

それで:

MethodThatNeedsFruit(banana.AsFruit());

名前が時間の経過とともに変化する可能性がある場合は、これを簡単に拡張してGetName、適合したオブジェクトを遅延呼び出しすることもできます。


もう1つのオプションは、すべての実装者をロードするDEBUGのみのチェックを行い、そのうちの1つが実際に/を実装していない場合に例外をスローすることです。これらのクラスは社内で使用するためのもののように思われるので、これにより、誰かが誤って間違ったことを実装するのを防ぐことができます。IFruitIBananaIApple

于 2012-05-29T09:32:47.383 に答える
2

あなたがしようとしていることを実際に行うことは不可能ですが、[Obsolete]属性を備えたIFruitインターフェースを使用して、理由を示すメッセージを付けて、人々を先延ばしにすることができます。

IBanana、IApple、...インターフェイスで、廃止された警告が表示されないようにします。

[Obsolete]
public interface IFruit {
    ...
}

#pragma warning disable 612
public interface IBanana : IFruit {
    ...
}
#pragma warning restore 612
于 2012-05-29T09:18:25.043 に答える
0

コードに何らかの理由がある場合(私があなたの状態を正しく理解していると仮定して)、次のようになります。

public class WaterMellon : IFruit, IVegetables...
{
}

そして、あなたはあなたのフレームワークの消費者がのメソッドにのみIFruitアクセスできるようにしたいのですが、私には他の既知のメソッドはなく、単にキャストします。

IFruit fruit = new WaterMelon();
fruit. //CAN ACCESS ONLY TO FRUIT IMPLEMNTATION AVAILABLE IN WATERMELON

これがあなたが求めているものではない場合は、明確にしてください。

于 2012-05-29T08:46:37.273 に答える