C# 接口不能声明类型

C# 接口不能声明类型,c#,C#,我在API中有一个抽象类,由另一个程序集中的方法使用。该类中定义了一个嵌套枚举,有点像这样: abstract public class Thing { public enum Status { Accepted, Denied, Pending }; abstract public Status status { get; private set; } etc... } 然后我决定,若这个东西是一个界面,那个将是一个更好的设计。但我不能这么做: public inte

我在API中有一个抽象类,由另一个程序集中的方法使用。该类中定义了一个嵌套枚举,有点像这样:

abstract public class Thing
{
    public enum Status { Accepted, Denied, Pending };
    abstract public Status status { get; private set; }
    etc...
}
然后我决定,若这个东西是一个界面,那个将是一个更好的设计。但我不能这么做:

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

这会产生错误消息“Interfaces cannot declare types.”但是,如果我将枚举的定义移到接口之外,首先我会破坏封装(状态类型实际上属于Thing,本身没有意义)更重要的是,我必须去修改许多其他使用此功能的程序集中的代码。您能想出任何解决方案吗?

正如错误所示,您只需将
状态的定义拉到接口之外即可。我知道它破坏了封装,但真的没有办法。我建议您将
状态
的名称更改为与
事物
有密切关系的名称--
事物状态
应该可以做到这一点

enum ThingStatus { Accepted, Denied, Pending };

public interface Thing
{
    ThingStatus status { get; }
    etc...
}

哦,是的,如果需要这样的实现,解决方案是使用抽象类。抽象类是一种不错的设计,在这种情况下肯定很有用


如果你坚持使用接口,我担心你将不得不采用p.s.w.g的解决方案,并违反一两条规则(这些只是指导原则,真的)

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

您必须在名称空间内或名称空间外将一个类型声明为public,然后在接口中声明此类型的方法

如果您担心破坏(您不能通过定义将数据成员封装在接口中)封装,您应该将
东西
保留为类。您的抽象基类没有问题。如果您在其他地方发现了这个问题,那么这个问题的注释有一些很好的选择。基本上,您可以在别处声明枚举,也可以使用类而不是接口……仅此而已。更遗憾的是,没有办法精确地完成您想要做的事情。“封装”参数对我来说不合理,我建议您无论如何摆脱公共嵌套类型。如果它可以暴露于世界,那么就这样对待它。谢谢大家提供的有用的答案!请注意,有一个公共函数返回枚举类型。因此,您不会通过在类之外定义枚举来破坏封装。值得注意的是,在语法中没有接口的语言中,抽象类是如何被用作接口的(C++就是一个明显的例子)。@KlitosKyriacou使用抽象类作为接口可以通过将所有成员声明为抽象来实现。但这在C#中并不完全相同。我们很欣赏这个答案,但这里的一些答案似乎已经说明了这一点。