.net không cho phép triển khai giao diện một phần trong các lớp cơ sở. Như một giảm thiểu tôi đã đến 3 giải pháp thay thế. Hãy giúp tôi quyết định cái nào phổ quát hơn về tái cấu trúc, biên dịch/chạy các lỗi thời gian, dễ đọc. Nhưng trước tiên là một vài ý kiến.C# triển khai giao diện một phần tốt nhất trong lớp cơ sở/trừu tượng
- Tất nhiên bạn luôn có thể truyền đối tượng đến IFoo và gọi bất kỳ phương thức nào mà không có bất kỳ cảnh báo trình biên dịch nào. Nhưng nó không hợp lý, bạn sẽ không làm điều đó bình thường. Cấu trúc này sẽ không xảy ra do tái cấu trúc.
- Tôi muốn tách biệt tối đa. Hợp đồng lớp trực tiếp (các phương thức và thuộc tính công khai) nên được tách riêng với các triển khai giao diện. Tôi sử dụng giao diện rất nhiều để tách các giao diện đối tượng.
so sánh của tôi:
- BaseClass1/MyClass1:
- con: Phải tạo trừu tượng ảo trong BaseClass1 cho mỗi phương pháp không được thực hiện các IFoo.
- con: Bọc phương pháp bổ sung - tác động năng suất nhẹ khi chạy.
- BaseClass2/MyClass2:
- con: không có cảnh báo trình biên dịch nếu không thực hiện Method2 trong MyClass2. Thay vào đó, ngoại lệ thời gian chạy. Tái cấu trúc với vùng phủ sóng thử nghiệm đơn vị kém có khả năng làm mất ổn định mã.
- con: phải đặt thêm cấu trúc lỗi thời để ngăn chặn cuộc gọi phương thức trực tiếp từ các lớp con.
- con: Phương pháp 2 là công khai cho BaseClass1 vì vậy nó là một phần của hợp đồng lớp học ngay bây giờ. Phải đặt cấu trúc "lỗi thời" để ngăn chặn cuộc gọi trực tiếp, không thông qua IFoo.
- BaseClass3/MyClass3:
- pro: (So với # 2). Dễ đọc hơn. Bạn thấy rằng MyClass2.Method2 là IFoo thực hiện, không chỉ là một số phương pháp overriden.
public interface IFoo
{
void Method1();
void Method2();
}
public abstract class BaseClass1 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
void IFoo.Method2()
{
IFooMethod2();
}
protected abstract void IFooMethod2();
}
public class MyClass1 : BaseClass1
{
[Obsolete("Prohibited direct call from child classes. only inteface implementation")]
protected override void IFooMethod2()
{
//some implementation
}
}
public abstract class BaseClass2 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
[Obsolete("Prohibited direct call from child classes. only inteface implementation")]
public virtual void Method2()
{
throw new NotSupportedException();
}
}
public abstract class MyClass2 : BaseClass2
{
public override void Method2()
{
//some implementation
}
}
public abstract class BaseClass3 : IFoo
{
void IFoo.Method1()
{
//some implementation
}
void IFoo.Method2()
{
throw new NotSupportedException();
}
}
public abstract class MyClass3 : BaseClass3, IFoo
{
void IFoo.Method2()
{
//some implementation
}
}
Đây là mẫu ** rất khó xử bạn đang cố triển khai. Bạn nói * ". NET không cho phép thực hiện một phần giao diện trong các lớp cơ sở." * - Có một lý do cho điều đó. Kiểu mã máy khách mong đợi cái gì đó ** thực hiện một giao diện **, bạn biết đấy, có lẽ ... ** thực hiện giao diện **. Ném ngoại lệ cho các phương pháp không được hỗ trợ như là một vấn đề tất nhiên là * rất * mùi mã xấu ... – Yuck
Đồng ý với Yuck. Nếu bạn có một biến kiểu 'IFoo', bạn thực sự mong đợi tất cả các phương thức' IFoo' được triển khai và có sẵn. Giao diện được thực hiện cho điều đó. – ken2k
Chỉ MyClass1 _must_ thực hiện đầy đủ giao diện. Và nó có. Vấn đề là có nhiều lớp con (tôi đã không đề cập đến nó trước đó), mỗi lớp phải thực hiện IFoo. Nếu không có lớp cơ sở, bạn phải sao chép/dán thực thi Method1, tương đương với tất cả các lớp con.Đây là những gì tôi đang cố gắng tránh. Nhưng thực thi Method2 thì khác trong các lớp con, vì vậy tôi không thể chỉ có một lớp thực hiện cả Method1 và Method2. – user1194528