Reputation: 11621
I have an abstract class in an API that is used by methods in another assembly. The class has a nested enum defined inside it, a bit like this:
abstract public class Thing
{
public enum Status { Accepted, Denied, Pending };
abstract public Status status { get; private set; }
etc...
}
I then decided it would be a better design if Thing was an interface. But I can't do this:
public interface Thing
{
enum Status { Accepted, Denied, Pending };
Status status { get; }
etc...
}
This produces the error message "Interfaces cannot declare types." However, if I move the definition of the enum outside of the interface, firstly I'd be breaking encapsulation (the Status type really belongs to Thing and is meaningless on its own) and more importantly I would have to go and modify the code in the many other assemblies that use this. Can you think of any solutions?
Upvotes: 18
Views: 15865
Reputation: 149020
As the error indicates, you just have to pull the definition of Status
outside of the interface. I understand that it breaks encapsulation, but there's really no way around this. I suggest you change the name of Status
to something which indicates a strong relation to Thing
-- ThingStatus
should do the trick.
enum ThingStatus { Accepted, Denied, Pending };
public interface Thing
{
ThingStatus status { get; }
etc...
}
Upvotes: 20
Reputation: 33381
abstract
class and interface
are different things. abstarct
class is abstraction, higher than your domain model and interface is the contract (behavior) of your domain entity. You can use both in your solution as necessary. In concrete scenario status
is not behavior it just state of entity. I think abstract class is more reliable choice.
Upvotes: 1
Reputation: 13600
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).
Upvotes: 5