D cho phép định nghĩa giao tiếp interface
, về kỹ thuật thì giống
như kiểu lớp class
, nhưng các hàm của nó chỉ được khai báo như giao diện,
còn phần định nghĩa thực sự của hàm phải được thực hiện trong
các lớp thừa kế từ giao tiếp.
interface Animal {
void makeNoise();
}
Trong giao tiếp Animal
, hàm makeNoise
chỉ được khai báo để đấy chứ
không có định nghĩa của hàm; lớp Dog
thừa kế từ Animal
sẽ định nghĩa
hàm như nó muốn.
class Dog : Animal {
override void makeNoise() {
...
}
}
auto dog = new Dog;
Animal animal = dog; // tự động chuyển kiểu
animal.makeNoise();
Không có giới hạn cho số hàm giao tiếp được định nghĩa lại trong một lớp, tuy nhiên mỗi lớp chỉ thừa kế từ chỉ một lớp cơ sở.
Ngoài các hàm ảo trong giao tiếp mà bạn phải định nghĩa lại trong lớp thừa kế,
D cũng cho phép chỉ ra các hàm không ảo (non-virtual
) trong giao tiếp chung,
đó là các hàm được định nghĩa trong giao tiếp và không thể định nghĩa lại
trong các lớp thừa kế. Việc này hạn chế việc làm hỏng các hàm chung của
các lớp thừa kế từ giao diện.
Việc cho phép định nghĩa hàm không ảo này gọi là
NVI,
và bạn dùng từ khóa final
như ví dụ sau:
interface Animal {
void makeNoise();
final doubleNoise() // NVI
{
makeNoise();
makeNoise();
}
}