Đây là sự khác biệt trong tiếng Anh đơn giản:
Giả sử bạn có một giao diện Machine
, trong đó có một chức năng Run()
, và một giao diện Animal
mà còn có một chức năng gọi là Run()
. Tất nhiên, khi một cỗ máy chạy, chúng ta đang nói về nó bắt đầu, nhưng khi một con vật chạy, chúng ta đang nói về nó di chuyển xung quanh. Vì vậy, điều gì sẽ xảy ra khi bạn có một đối tượng, hãy gọi nó là Aibo
, cả hai là số Machine
và một số Animal
? (Aibo là một con chó cơ khí, bằng cách này.) Khi Aibo
chạy, anh ta bắt đầu lên, hoặc không di chuyển xung quanh? Dứt khoát thực hiện một giao diện cho phép bạn thực hiện điều đó khác biệt:
interface Animal
{
void Run();
}
interface Machine
{
void Run();
}
class Aibo : Animal, Machine
{
void Animal.Run()
{
System.Console.WriteLine("Aibo goes for a run.");
}
void Machine.Run()
{
System.Console.WriteLine("Aibo starting up.");
}
}
class Program
{
static void Main(string[] args)
{
Aibo a = new Aibo();
((Machine)a).Run();
((Animal)a).Run();
}
}
Việc nắm bắt ở đây là tôi không thể chỉ đơn giản là gọi a.Run()
vì cả hai hiện thực của tôi về chức năng được gắn một cách rõ ràng để một giao diện. Điều đó có ý nghĩa, bởi vì nếu không thì người khiếu nại sẽ biết cái nào để gọi? Thay vào đó, nếu tôi muốn gọi hàm Run()
trên trực tiếp Aibo
của mình, tôi sẽ phải cũng triển khai chức năng đó mà không có giao diện rõ ràng.
Triển khai rõ ràng cũng hữu ích khi lớp của bạn cần triển khai giao diện nội bộ mà bạn không muốn xuất công khai khỏi hội đồng của mình. – Dave