2013-05-29 37 views
15

Một người phỏng vấn đã hỏi tôi câu hỏi dưới đây và tôi không thể trả lời:Tại sao chúng ta cần giao diện khi lớp trừu tượng tồn tại?

Tại sao chúng ta cần Giao diện khi lớp trừu tượng tồn tại?

Bất kể phương thức nào chúng ta đang viết trong giao diện, chúng ta cũng có thể viết trong lớp Tóm tắt. Vậy tại sao chúng ta cần giao diện riêng biệt?

Ai có thể vui lòng cho biết lý do là gì?

trước nhờ ...

+6

nhiều luồng thừa kế cần lưu ý, bạn có thể triển khai nhiều giao diện nhưng chỉ có thể kế thừa một lớp trong C# –

+2

Từ phối cảnh Java, lớp trừu tượng dành cho phân cấp thừa kế, giao diện cho hợp đồng thực hiện. – NINCOMPOOP

+1

Giao diện cũng vô giá trong các kịch bản Dependency Injection và Unit Testing. Các lớp cơ sở trừu tượng vẫn có thể chứa logic, và kết quả là không thể được mô phỏng hoàn toàn trong các kịch bản thử nghiệm. – mclark1129

Trả lời

15

Có một số khác biệt,

  • Các lớp trừu tượng có thể chỉ có một lớp cha mẹ, trong khi một lớp có thể thực hiện một số giao diện.
  • Giao diện không thể chứa bất kỳ triển khai nào, các lớp trừu tượng có thể (chúng có thể có các phương thức trừu tượng ngoài các phương thức không trừu tượng).

Giao diện thật tuyệt vời để tập trung vào 'chế độ xem' mà chúng tôi có thể có trên lớp học. Chế độ xem này có thể được chia sẻ bởi nhiều lớp triển khai giao diện.

Ví dụ: DataTable triển khai IListSourceISerializable. Vì vậy, tùy thuộc vào ngữ cảnh, bạn có thể xem nó như là một nguồn danh sách để đọc dữ liệu của nó hoặc là một lớp mà các cá thể có thể được tuần tự hóa. Khi bạn làm như vậy, bạn tập trung vào một khung nhìn specifc mà bạn có thể có một cá thể.

+0

Tôi không hoàn toàn bị thuyết phục bởi câu trả lời này .. Ngôn ngữ có thể đã được thiết kế để cho phép nhiều thừa kế, và nó sẽ không giao tiếp lỗi thời. Không thể bắt nguồn từ nhiều hơn một lớp trừu tượng không phải là một lý do để chọn một giao diện trên một lớp hoặc ngược lại. – Daniel

+0

@Daniel, tôi đồng ý, tôi chỉ nêu bật một trong những điểm khác biệt nhất –

10

Giao diện thể hiện hợp đồng, trong khi bạn có thể thực hiện một số hợp đồng đó trong các lớp (trừu tượng) khác nhau.

public interface IExample 
{ 
    void Do(); 
} 

public abstract class DoFirst : IExample 
{ 
    public void Do() 
    { 
     Console.WriteLine("Doing it the first way"); 
    } 
} 

public abstract class DoSecond : IExample 
{ 
    public void Do() 
    { 
     Console.WriteLine("Doing it the second way"); 
    } 
} 

public class DoFirstConcrete : DoFirst, IExample 
{ 
    public void DoSomethingElse() 
    { 
     Do(); 
     Console.WriteLine("Doing something else also with first."); 
    } 
} 

public class DoSecondConcrete : DoSecond, IExample 
{ 
    public void DoSomethingElse() 
    { 
     Do(); 
     Console.WriteLine("Doing something else also with second."); 
    } 
} 
8

Bạn lớp trừu tượng là triển khai từng phần. Giao diện là hợp đồng, để biết những gì lớp trừu tượng của bạn có thể làm. Bạn cần một giao diện để mô tả nó.

3

Bạn có thể triển khai nhiều giao diện nhưng chỉ kế thừa từ một lớp trừu tượng.

Giao diện là vỏ rỗng, chỉ có chữ ký (tên/params/kiểu trả về) của phương thức. Các phương pháp không chứa bất cứ điều gì. Giao diện không thể làm gì cả. Đó chỉ là một mẫu

Lớp trừu tượng, không giống như giao diện, là các lớp. Có nhiều tốn kém hơn để sử dụng vì có một tra cứu để làm khi bạn kế thừa từ họ.

Lớp trừu tượng trông rất giống giao diện, nhưng chúng có nhiều thứ hơn: bạn có thể xác định hành vi cho chúng. Đó là nhiều hơn về một chàng trai nói rằng "những lớp này nên trông như thế, và họ có điểm chung, vì vậy hãy điền vào chỗ trống!".

Quoted e-satis từ đây (nhiều thông tin quá): What is the difference between an interface and abstract class?

0

Bạn có thể không kế thừa từ nhiều lớp trừu tượng, nhưng bạn có thể thực hiện nhiều giao diện.

Các vấn đề liên quan