Mô hình kế thừa triển khai thực hiện mối quan hệ "IS A LOẠI", trong khi mô hình kế thừa giao diện mô hình mối quan hệ "CÓ THỂ BEHAVE LIKE". Không phải ngẫu nhiên mà nhiều tên giao diện BCL kết thúc bằng "-able", thể hiện khả năng làm điều gì đó. Để minh họa, hãy hình ảnh mã sau:
class Person
{
public string Name{get;set;}
public void Walk() {/*code elided*/}
}
class Employee : Person
{
public int Id{get;private set;}
}
Rõ ràng, một nhân viên "là một loại" Người. Tất cả nhân viên đều là con người, do đó tất cả họ đều có Tên và có thể Đi bộ(). Bằng mọi cách làm cho người hoặc nhân viên trừu tượng, nó không thay đổi thực tế là tất cả nhân viên đều là con người.
Bây giờ chúng ta hãy trừu tượng hơn một chút và nói về khái niệm là một chiếc xe. Điều thiết yếu tuyệt đối cho một thứ là một chiếc xe là nó phải có khả năng di chuyển và dừng lại. Bạn có thể bao gồm lái và chở hành khách nhưng tôi giữ nó rất trừu tượng.
Hãy nghĩ về một số thứ là phương tiện. Một chiếc xe, tất nhiên, nhưng làm thế nào về một người? Họ có thể di chuyển và dừng lại (và khi tôi đưa cho cháu trai và cháu gái của tôi heo con, tôi cũng mang theo hành khách!) Một chiếc ghế bành trướng? Tôi mãi mãi davrossing xung quanh văn phòng. Tôi cũng là một thủy thủ quan tâm, và sử dụng gió để tăng tốc và giảm tốc độ xe của tôi. Bạn không thể mô hình kiểu quan hệ này bằng cách sử dụng thừa kế thực hiện, bởi vì bạn có nhiều thứ khác nhau "có thể hành động như" một chiếc xe nhưng không phải thừa kế thừa kế từ cùng một lớp cơ sở.
Một pogostick (với lời xin lỗi đến các chuyên gia pogo-ers) LÀ MỘT LOẠI đồ chơi, nhưng CAN ACT LÀ một chiếc xe. Không phải tất cả đồ chơi đều là xe cộ. Một người không có mối quan hệ với một chiếc xe, khác với thực tế là nó có thể ACT như một chiếc xe.
interface IVehicle
{
void Move();
void Stop();
}
class Toy{}
class PogoStick : Toy, IVehicle
{
public void Move(){ /* boing boing */}
public void Stop(){ /* fall over */}
}
class Car: IVehicle
{
public void Move(){ /* vroom vroom */}
public void Stop(){ /* <screeeech!> */}
}
class Person : IVehicle
{
public string Name{get;set;}
public void Walk() {/*code elided*/}
void IVehicle.Move() { Walk(); }
void IVehicle.Stop() { /*whatever!*/}
}
class Program
{
static void Main()
{
IVehicle[] vehicles = new IVehicle[3];
vehicles[0] = new PogoStick();
vehicles[1] = new Car();
vehicles[2] = new Employee(); //implements IVehicle because it IS A KIND OF Person
vehicles.ForEach(v => v.Move());
//it's worth pointing out that
vehicles[2].Stop();
//works fine, but
Person p = new Person();
p.Move();
//won't, as I explicitly implemented the interface, meaning I can only get at the
//methods via a reference to the interface, not to the implementing class.
}
}
Để sử dụng ví dụ từ .NET, chuỗi trên trái đất có chung danh sách? Không nhiều, ngoại trừ việc tôi có thể "foreach" cả trong số họ:
class Demo
{
static void Main()
{
string s = "Hello!";
List<Employee> payroll = new List<Employee>();
for each (var item in s)
{
Console.WriteLine(item);
}
for each (var item in payroll)
{
Console.WriteLine(item);
}
}
Các lớp cơ sở chung cho chuỗi và Danh mục là đối tượng, nhưng không phải tất cả đối tượng là "foreach-thể", do đó phải là một cái gì đó khác đang diễn ra. Cụ thể là cả hai đều triển khai giao diện IEnumerable (có thể thực hiện được!)
Tại sao không chọn ví dụ có nhiều thừa kế, ví dụ: một người quản lý hỗ trợ 'ITest' và' ISerializable' và 'ICloneable', vv Sau đó, bạn sẽ không nghi ngờ trả lời câu hỏi của riêng bạn! –
Vì vậy, Giao diện được sử dụng về cơ bản để triển khai nhiều Thừa kế. không sử dụng khác. – Shikha
Đây là bản sao gần giống với http://stackoverflow.com/questions/2151959/using-interface-variables - câu trả lời có thể trả lời câu hỏi của bạn (xem thêm các nhận xét cho câu trả lời được chấp nhận). – itowlson