Khái niệm
Interface, protocol và trait đều hướng tới cùng một ý tưởng: mô tả tập hành vi mà một kiểu dữ liệu phải cung cấp. Chúng giúp chương trình phụ thuộc vào hợp đồng hành vi thay vì phụ thuộc trực tiếp vào lớp cụ thể.
Ví dụ mô tả hành vi in giá trị
from abc import ABC, abstractmethod
class Printable(ABC):
@abstractmethod
def print_value(self):
pass
class Report(Printable):
def print_value(self):
print("Bao cao")
interface IPrintable
{
void PrintValue();
}
class Report : IPrintable
{
public void PrintValue()
{
Console.WriteLine("Bao cao");
}
}
interface Printable {
printValue(): void;
}
class Report implements Printable {
printValue(): void {
console.log("Bao cao");
}
}
package main
import "fmt"
type Printable interface {
PrintValue()
}
type Report struct{}
func (Report) PrintValue() {
fmt.Println("Bao cao")
}
trait Printable {
fn print_value(&self);
}
struct Report;
impl Printable for Report {
fn print_value(&self) {
println!("Bao cao");
}
}
Ghi chú theo ngôn ngữ
Pascal truyền thống không có interface theo đúng nghĩa của các ngôn ngữ hiện đại trong mọi môi trường. Một số biến thể Object Pascal có hỗ trợ, nhưng mức độ hoàn chỉnh phụ thuộc vào trình biên dịch.
Go dùng interface rất tự nhiên: kiểu dữ liệu không cần khai báo tường minh là mình triển khai interface; chỉ cần cung cấp đúng tập phương thức là đủ.
Trong Rust, trait vừa mô tả hành vi chung vừa tham gia mạnh vào hệ thống generic. Đây là nền tảng cho nhiều kỹ thuật trừu tượng hóa trong ngôn ngữ này.
Python không có từ khóa interface. Thay vào đó, dùng lớp trừu tượng (Abstract Base Class) từ module abc với @abstractmethod để định nghĩa hợp đồng hành vi mà các lớp con phải thực hiện.
C# có interface như một cấu trúc ngôn ngữ chính thức. Lớp có thể implement nhiều interface cùng lúc — đây là cách C# giải quyết giới hạn chỉ một lớp cha. Từ C# 8, interface có thể có phương thức mặc định.
TypeScript có interface rất mạnh: chỉ kiểm tra tại compile time, không tạo ra code khi biên dịch sang JavaScript. Một kiểu có thể implements nhiều interface và extends interface khác.
Bình luận