Lớp

D cũng có lớp và giao diện như trong Java hay C++.

Lớp bất kỳ thừa kế từ lớp Object, hay nói cách khác Object là mẹ của tất cả các lớp khác trong D.

class Foo { } // thừa kế từ Object
class Bar : Foo { } // Bar cũng là Foo

Lớp được khởi tạo trên bộ nhớ heap nhờ new:

auto bar = new Bar;

Đối tượng trong lớp luôn là kiểu tham chiếu, nên không có chuyện sao chép giá trị như kiểu ghép struct.

Bar bar = foo; // bar là con trỏ tới foo

Bộ dọn rác giải phóng bộ nhớ khi không còn tham chiếu nào trỏ tới đối tượng của lớp.

Thừa kế

Chỉ thị override dùng khi cần định nghĩa lại hàm từ lớp mẹ. Việc ép buộc dùng từ khóa là để hạn chế các lỗi do vô ý.

class Bar : Foo {
    override functionFromFoo() {}
}

Trong D một lớp chỉ thừa kế từ đúng một lớp khác.

Hàm trừu tượng và hàm hoàn chỉnh

  • Khi một hàm được đánh dấu final, nó được xem là hoàn chỉnh và các lớp thừa kế không thể định nghĩa lại hàm đó.
  • Hàm trừu tượng được đánh dấu bởi abstract, là các hàm bắt buộc phải được định nghĩa lại trong các lớp thừa kế.
  • Một lớp trừu tượng được đánh dấu với abstract, là lớp không được khởi tạo trên bộ nhớ.
  • super(..) dùng để gọi đến hàm khởi tạo của lớp mẹ.

Phép so sánh

Phép so sánh ==!= dùng cho nội dung đối tượng của lớp. Vì null không có nội dung nào, việc dùng hai phép so sánh này với null là không hợp lệ; bạn cần dùng is như ví dụ sau:

MyClass c;
if (c == null)  // lỗi
    ...
if (c is null)  // tốt
    ...

Với lớp ghép (struct) việc so sánh đối tượng diễn ra ở từng bit thông tin.

Đọc thêm

rdmd playground.d