Nó phụ thuộc vào vị trí của bạn trong chu kỳ phát triển, nhưng đôi khi khi phác thảo ra một thuật toán, bạn muốn thực hiện trừu tượng về các khối phức tạp mà không thực hiện chúng ngay lập tức.
def full_algo():
init_stuff()
process_stuff()
...
Bạn biết nó init_stuff
sẽ hoạt động như thế nào , nó khá đơn giản trong đầu bạn nhưng bạn không thực sự cần nó ngay lập tức, vì vậy bạn tuyên bố nó là một hàm trống. Nó sẽ cho phép mã của bạn biên dịch và chạy mà không cần bận tâm về các chi tiết chính.
Một cách sử dụng khác cho các ứng dụng được phát hành là khi sử dụng tính kế thừa. Giả sử rằng bạn có một lớp lớn xác định hành vi của mã cụ thể nền tảng. Bạn có thể kết thúc với một logic tương tự như thế này:
init_filesystem();
access_files();
release_filesystem();
Mã này sẽ hoạt động trên nhiều nền tảng, nhưng một số nền tảng có thể không cần khởi tạo hệ thống tệp. Sau đó, kế thừa của bạn sẽ trông như thế này (ảo với = 0 trong C ++ chỉ có nghĩa là các lớp dẫn xuất PHẢI thực hiện các phương thức đó):
class FileSystem{
virtual void init_filesystem() = 0;
virtual void access_files() = 0;
virtual void release_filesystem() = 0;
};
Sau đó, một triển khai cụ thể của lớp này (giao diện) có thể không làm gì đối với một số phương thức đó. Ngoài ra, lớp cơ sở có thể khai báo các phương thức rỗng cho init / phát hành thay vì khai báo chúng ảo.
Cuối cùng (và đáng xấu hổ), đôi khi bạn duy trì một ứng dụng rất cũ. Bạn sợ rằng các phương pháp xóa sẽ phá vỡ mọi thứ. Điều này xảy ra khi bạn có sự kế thừa phức tạp không được hiểu đúng hoặc khi bạn có nhiều con trỏ hàm (gọi lại). Bạn chỉ cần xóa mã bên trong chúng để chúng được gọi bằng mọi cách mà không phá vỡ bất cứ điều gì.