17

別のアセンブリのメソッドで使用されるAPIに抽象クラスがあります。クラスには、次のように、ネストされた列挙型が定義されています。

abstract public class Thing
{
    public enum Status { Accepted, Denied, Pending };
    abstract public Status status { get; private set; }
    etc...
}

それから、Thingがインターフェースであれば、より良いデザインになると思いました。しかし、私はこれを行うことはできません:

public interface Thing
{
    enum Status { Accepted, Denied, Pending };
    Status status { get; }
    etc...
}

これにより、「インターフェイスは型を宣言できません」というエラーメッセージが表示されます。ただし、列挙型の定義をインターフェイスの外に移動すると、最初にカプセル化が解除され(ステータスタイプは実際にはThingに属し、それ自体では意味がありません)、さらに重要なことに、コードを変更する必要があります。これを使用する他の多くのアセンブリ。何か解決策を思いつくことができますか?

4

4 に答える 4

20

Statusエラーが示すように、インターフェイスの外側の定義をプルする必要があります。カプセル化が破られることは理解していますが、これを回避する方法は実際にはありません。の名前を、 --Statusとの強い関係を示す名前に変更することをお勧めします。ThingThingStatus

enum ThingStatus { Accepted, Denied, Pending };

public interface Thing
{
    ThingStatus status { get; }
    etc...
}
于 2013-02-21T17:56:49.817 に答える
5

そうです、そのような実装が必要な場合、解決策は抽象クラスを使用することです。抽象クラスは悪い設計ではなく、このような状況で確かに役立ちます。

インターフェイスの使用を主張する場合は、pswgのソリューションを使用して、ルールを1つか2つ破らなければならないのではないかと思います(これらはとにかくガイドラインにすぎません)。

于 2013-02-21T17:59:54.680 に答える
1

abstractクラスとinterfaceは別のものです。abstarctクラスは抽象化であり、ドメインモデルよりも高く、インターフェイスはドメインエンティティのコントラクト(動作)です。必要に応じて、ソリューションで両方を使用できます。具体的なシナリオstatusでは、動作ではなく、エンティティの状態だけです。抽象クラスの方が信頼できる選択だと思います。

于 2013-02-21T18:07:06.860 に答える
0

名前空間内または名前空間外で型をパブリックとして宣言してから、インターフェイスでこの型のメソッドを宣言する必要があります

于 2020-11-06T03:26:29.557 に答える