Java phân biệt rõ ràng giữa class
và interface
. (Tôi tin rằng C # cũng có, nhưng tôi không có kinh nghiệm với nó). Tuy nhiên, khi viết C ++, không có sự phân biệt ngôn ngữ bắt buộc giữa lớp và giao diện.
Do đó, tôi luôn xem giao diện là một cách giải quyết cho việc thiếu nhiều kế thừa trong Java. Làm cho một sự khác biệt như vậy cảm thấy độc đoán và vô nghĩa trong C ++.
Tôi luôn có xu hướng đi theo cách tiếp cận "viết mọi thứ theo cách rõ ràng nhất", vì vậy nếu trong C ++, tôi đã có cái được gọi là giao diện trong Java, ví dụ:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
và sau đó tôi đã quyết định rằng hầu hết những người thực hiện Foo
muốn chia sẻ một số chức năng phổ biến mà tôi có thể sẽ viết:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() {}
protected:
// If it needs this to do its thing:
int internalHelperThing(int);
// Or if it doesn't need the this pointer:
static int someOtherHelper(int);
};
Mà sau đó làm cho nó không phải là một giao diện theo nghĩa Java nữa.
Thay vào đó, C ++ có hai khái niệm quan trọng, liên quan đến cùng một vấn đề thừa kế cơ bản:
virtual
vô sinhCác lớp không có biến thành viên có thể chiếm không gian thừa khi được sử dụng làm cơ sở
"Các tiểu dự án lớp cơ sở có thể có kích thước bằng không"
Trong số những người tôi cố gắng tránh # 1 bất cứ khi nào có thể - thật hiếm khi gặp phải một kịch bản trong đó thực sự là thiết kế "sạch nhất". Tuy nhiên, # 2 là một sự khác biệt tinh tế, nhưng quan trọng giữa sự hiểu biết của tôi về thuật ngữ "giao diện" và các tính năng ngôn ngữ C ++. Kết quả của điều này là tôi hiện tại (gần như) không bao giờ gọi mọi thứ là "giao diện" trong C ++ và nói về các lớp cơ sở và kích thước của chúng. Tôi có thể nói rằng trong ngữ cảnh của "giao diện" C ++ là một cách gọi sai.
Tôi đã nhận thấy rằng mặc dù không có nhiều người tạo ra sự khác biệt như vậy.
- Tôi có chịu mất bất cứ điều gì bằng cách cho phép (ví dụ
protected
) cácvirtual
chức năng không tồn tại trong một "giao diện" trong C ++ không? (Cảm giác của tôi hoàn toàn ngược lại - một vị trí tự nhiên hơn cho mã được chia sẻ) - Là thuật ngữ "giao diện" có ý nghĩa trong C ++ - nó chỉ ngụ ý thuần túy
virtual
hay sẽ công bằng khi gọi các lớp C ++ không có biến thành viên vẫn là giao diện?
~Foo() {}
trong một lớp trừu tượng là một lỗi dưới (gần như) mọi tình huống.
internalHelperThing
có thể được mô phỏng trong hầu hết các trường hợp.