Như đã nói, NVI là một thành ngữ progamming, liên quan đến một loại ngôn ngữ. Nó được thúc đẩy bởi Herb Sutter số những người khác, bởi vì nó giúp các hợp đồng thực thi:
- bất biến lớp
- hợp đồng function (khẳng định qua các thông số thông qua và giá trị trả về tạo ra)
- hoạt động lặp đi lặp lại (như khai thác gỗ)
- kiểm soát đối với trường hợp ngoại lệ được tạo ra (xấu ý tưởng mặc dù;))
tuy nhiên, việc thực hiện trên thực tế có thể khác nhau đáng kể, ví dụ một ví dụ khác của NVI thực hiện là kết hợp nó với Pimpl:
class FooImpl;
class Foo
{
public:
enum type { Type1, Type2 };
Foo(type t, int i, int j);
int GetResult() const;
private:
FooImpl* mImpl;
};
Và đối với việc thực hiện:
struct FooImpl
{
virtual ~FooImpl();
virtual int GetResult() const;
};
class FooType1: public FooImpl
{
public:
FooType1(int i, int j);
virtual int GetResult() const;
private:
/// ...
};
Tôi luôn thấy rằng nó được truyền đạt điểm tốt hơn. Bạn đã tìm ra nó chưa?
Điểm chính là virtual
là chi tiết triển khai. Và việc hiển thị chi tiết triển khai trong giao diện là một ý tưởng tồi, bởi vì bạn có thể muốn thay đổi chúng.
Ngoài ra, chi tiết triển khai có xu hướng lộn xộn với khả năng tương thích nhị phân. Ví dụ, thêm một phương thức virtual
mới trong một lớp có thể thay đổi cách bố trí của bảng ảo (kỹ thuật triển khai chung) và do đó tạo ra khả năng tương thích nhị phân. Trên gcc, bạn cần phải chắc chắn rằng bạn thêm nó cuối cùng (trong số ảo) nếu bạn muốn duy trì tính tương thích.
Bằng cách sử dụng kết hợp NVI + Pimpl ở trên, không có virtual
ở tất cả (thậm chí không riêng tư) trong lớp được hiển thị. Bố cục bộ nhớ tương thích ngược và tiến. Chúng tôi đã đạt được khả năng tương thích nhị phân.
Ở đây, chúng tôi sử dụng một số mô hình cùng một lúc:
- Template Method
- Chiến lược (kể từ khi chúng ta có thể trao đổi con trỏ theo ý muốn)
- Factory (để quyết định thực hiện chúng tôi nhận)
Nguồn
2010-06-20 11:11:47
Tôi sẽ không sử dụng liên kết wikipedia làm tài liệu tham khảo, việc sử dụng khóa của chúng dễ vỡ khi đối mặt với ngoại lệ ... –