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表明与 - 有密切关系的东西Thing-ThingStatus应该可以解决问题。

enum ThingStatus { Accepted, Denied, Pending };

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

Oh yes, the solution is to use an abstract class if you need such implementation. Abstract classes are not a bad design and are certainly useful in situations like this.

If you insist on using interfaces, I'm afraid you'd have to go with the solution from p.s.w.g and break a rule or two (those are just guidelines anyway, really).

于 2013-02-21T17:59:54.680 回答
1

abstract类和interface是不同的东西。abstarct类是抽象,高于您的域模型,接口是您的域实体的合同(行为)。您可以根据需要在解决方案中使用两者。在具体场景status中不是行为,它只是实体的状态。我认为抽象类是更可靠的选择。

于 2013-02-21T18:07:06.860 回答
0

您必须在命名空间内或命名空间外将类型声明为公共,然后在接口中声明此类型的方法

于 2020-11-06T03:26:29.557 回答