Kết hợp và thừa kế giao diện

Một phần của tài liệu Xây dựng ngôn ngữ mẫu cho lập trình dựa trên thành phần (Trang 35)

Trường hợp thông thường là chỉ có một giao diện yêu cầu được đặc tả trong sự đặc tả một thành phần, nhưng khi có một số thành phần, mỗi thành phần cung cấp một phần các thao tác trong giao diện yêu cầu. Khi đó chúng ta cần đặt các thành phần này cùng nhau để cung cấp một giao diện đơn phù hợp với giao diện yêu cầu. Hai giao diện I:<A1, M1>J:<A2, M2> là có thể kết hợp nếu những điều kiện sau đạt được:

1. Bất kỳ tên thuộc tính dùng chung phải được trang bị cùng kiểu trong hai giao diện, ví dụ nếu x : T1 A1 và x : T2 A2 thì T1 = T2.

2. Nếu IJ dùng chung một phương thức, thì chúng phải có cùng nguyên mẫu đối với phương thức đó, và hơn nữa chúng phải có cùng tập thuộc tính, ví dụ nếu op in U out V( i: i, i: )iMi , với i = 1, 2 thì A1 = A2,

1 2, 1 2

inin outout , U1U V2, 1V2.

Định nghĩa 1 (Kết hợp các giao diện): Cho {Ik:A Mk, k  |k K} là một họ xác định của các giao diện có thể kết hợp. Sự kết hợp của chúng âk KIk được định nghĩa là , k K k df k k k K k K I A M         â

Lý do cần thừa kế giao diện là bởi một thành phần có thể chỉ cung cấp một phần các dịch vụ cần dùng cho một thành phần khác hoặc vài thao tác được cung cấp là không thực sự phù hợp cho nhu cầu. Chúng ta vẫn có thể sử dụng như một thành phần bằng cách viết lại một số thao tác hoặc mở rộng nó với vài thao tác và các thuộc tính khác. Các dịch vụ được cung cấp mới này có thể được nhận ra bởi các thành phần khác, hoặc có thể được lập trình sử dụng các thao tác kế

thừa, hoặc viết lại một vài thao tác kế thừa. Nếu một thành phần nhận ra giao diện kế thừa được yêu cầu trong thiết kế giao diện mở rộng, thành phần đó không được thay đổi mặc dù những thao tác cung cấp của nó có thể được sử dụng trong thiết kế cho những thao tác bổ sung hoặc cho các thao tác kế thừa được ghi đè. Vì thế, mục đích trên hết của thừa kế là sử dụng lại (reuse) và mở rộng (extension) hoặc tiến hóa (evolution).

Ta xét trường hợp đơn giản, khi một giao diện được thừa hưởng từ một giao diện khác. Cho J:<A1, M1> là một giao diện, giả sử rằng A2 là một tập các thuộc tính và M2 là tập các phương thức, nếu không có thuộc tính của A1 xuất hiện trong A2, và không có phương thức trong M1 trùng với phương thức khác trong

M2. Khi đó ký hiệu: I extends J with <A2,M2> để miêu tả một giao diện <A, M> có các tập thuộc tính và phương thức được định nghĩa bởi:

1 2, 1 2

df df

AAA MMM .

Trong trường hợp tổng quát, đa kế thừa được ký hiệu theo mẫu: I extends {Ik

| kK} with <A, M>, điều này định nghĩa một giao diện I extends âk KIk with

<A, M>. Ở đây {Ik | kK} là tập các giao diện có thể kết hợp được.

Một phần của tài liệu Xây dựng ngôn ngữ mẫu cho lập trình dựa trên thành phần (Trang 35)