Tôi có một lớp trừu tượng trong một API được sử dụng bởi các phương thức trong một assembly khác. Lớp có một enum lồng nhau được xác định bên trong nó, một chút như thế này:Giao diện không thể khai báo các loại
abstract public class Thing
{
public enum Status { Accepted, Denied, Pending };
abstract public Status status { get; private set; }
etc...
}
Sau đó tôi quyết định nó sẽ là một thiết kế tốt hơn nếu Thing là một giao diện. Nhưng tôi không thể làm điều này:
public interface Thing
{
enum Status { Accepted, Denied, Pending };
Status status { get; }
etc...
}
Điều này tạo ra thông báo lỗi "Giao diện không thể khai báo loại". Tuy nhiên, nếu tôi di chuyển định nghĩa của enum bên ngoài giao diện, trước tiên tôi sẽ phá vỡ đóng gói (loại trạng thái thực sự thuộc về Thing và vô nghĩa một mình) và quan trọng hơn tôi sẽ phải đi và sửa đổi mã trong nhiều hội đồng khác sử dụng nó. Bạn có thể nghĩ ra giải pháp nào không?
Nếu bạn lo lắng về việc * phá vỡ * (Bạn không thể đóng gói các thành viên dữ liệu trong giao diện bằng cách đóng gói), bạn nên để nguyên 'Thing' làm lớp. Không có gì sai với lớp cơ sở trừu tượng của bạn. –
tìm thấy một số địa điểm khác mà câu hỏi này được đặt ra, nhận xét này về ý kiến này có một số lựa chọn tốt. http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/14beb8d1-63d9-42f7-b036-eb9ebb106d08 về cơ bản, bạn có thể khai báo enum ở nơi khác hoặc sử dụng lớp học thay thế của một giao diện .... và đó là về nó. Không có cách nào để làm chính xác những gì bạn đang cố gắng làm, điều đó thật đáng tiếc. – Nevyn
Đối số "đóng gói" không hợp lý với tôi và tôi khuyên bạn nên loại bỏ loại lồng nhau công khai. Nếu nó có thể được tiếp xúc với thế giới, sau đó đối xử với nó như vậy. –