Ai quyết định thuật ngữ downcasting và u ám?


8

Theo như tôi biết, thuật ngữ này xuất phát từ cách phân cấp kế thừa được hiển thị theo truyền thống, với các kiểu mở rộng ở phía dưới và các kiểu cha mẹ ở trên cùng.

Điều này là một chút vô nghĩa, trừ khi bạn cảm thấy muốn gọi các chương trình phát sóng bên trái và phát sóng bên phải sau đây .

hệ thống phân cấp thừa kế ngang

Tôi không tìm kiếm ý kiến tại sao thuật ngữ là như vậy, nhưng chúng được chào đón nhiều hơn là ý kiến. Tôi đang tìm kiếm tài liệu tham khảo về người đầu tiên giới thiệu và downcasting, và tại sao họ quyết định tên đó .


1
Mặc dù chúng có phần tự giải thích, tôi chưa từng nghe ai thực sự sử dụng các thuật ngữ này. Các bạn có tham khảo không? IOW: "Bạn u ám với một đối tượng có thể làm ít hơn và bạn hạ thấp đối tượng có thể làm được nhiều hơn." [cần dẫn nguồn]
Nhiệm vụ

1
Tôi coi việc lên sóng an toàn hơn (bạn hướng tới một loại được đảm bảo có ít nhất một tập hợp con của các thành viên của loại bắt đầu), trong khi đó, khi hạ thấp bạn không thể thực sự chắc chắn về những gì bạn sẽ tìm thấy. An toàn hơn -> tốt hơn, do đó, lý do điển hình bạn sử dụng, hoạt động. [/ ý kiến]
yannis

2
Và khá quan trọng. Bạn đã đọc bài viết từ nơi bạn có hình ảnh con chó / mèo? Nếu không, nó hỗ trợ nhận xét trước đây của tôi: upcasting là an toàn hơn, vì nó không bao giờ có thể thất bại, mặt khác có thể hạ thấp. Ngoài ra, tôi cũng nói thêm rằng việc phát sóng khiến chúng ta ở mức độ trừu tượng cao hơn (nếu điều đó giúp bạn dễ nhớ hơn).
yannis

1
Nó không phải dễ dàng như vậy để tìm kiếm nguồn gốc của họ, vì upcastingdowncasting có ý nghĩa lớn hơn. Nhưng có lẽ những ý nghĩa đó đã ảnh hưởng đến các từ OOP. Nhưng Ngram cho thấy sự gia tăng lớn vào khoảng năm 1980 và 1995. Các tài liệu tham khảo sớm nhất về downcast [ing] tôi tìm thấy là từ năm 1992 trong văn học C ++ ...
Hugo

Câu trả lời:


3

Về cơ bản down-up-castlà sự tiếp nối hợp lý của subtype( subclasstrong OOP) và supertype( superclasstương ứng), ví dụ: biểu diễn cổ điển của loại dẫn xuất được đặt bên dưới loại gốc - subloại.

Nếu chúng tôi tìm kiếm thuật ngữ, subtypingchúng tôi tìm thấy sau đây ( Wikipedia ):

Khái niệm phân nhóm trong các ngôn ngữ lập trình có từ những năm 1960; nó đã được giới thiệu trong các dẫn xuất Simula. Các phương pháp điều trị chính thức đầu tiên của phân nhóm đã được đưa ra bởi John C. Reynold vào năm 1980, người đã sử dụng lý thuyết thể loại để chính thức hóa các chuyển đổi ngầm và Luca Cardelli (1985).

Vì vậy, như nhiều thứ khác, nó bắt nguồn từ một thứ mơ hồ được gọi ở đây là "dẫn xuất Simula" (có thể là các ngôn ngữ OOP đầu tiên). Simula, tuy nhiên, đã có khái niệm về lớp con , nhưng không có tất cả các thuộc tính của OOP.


Như đã nêu trong câu hỏi của tôi: "thuật ngữ xuất phát từ cách phân cấp thừa kế được hiển thị theo truyền thống" . Điều này không giải thích lý do tại sao "phụ" và "siêu" nên được hiển thị là "lên" và "xuống". Tôi đã thêm SIMULA như một bình luận.
Steven Jeuris

1
Hmm ... Vì vậy, bạn không thấy kết nối giữa "phụ" và "xuống"? Còn phụ đề, Subzero, thăng hoa và các từ tiếng Anh thông dụng khác thì sao?
Alexander Galkin

1
Ps: Trong SIMULA , khái niệm thừa kế ban đầu được gọi là "ghép" và sau đó là "tiền tố" . Tôi không nhớ đã đọc về phân nhóm hoặc siêu phân loại khi đọc tài liệu SIMULA. Tôi tin rằng đây là một thuật ngữ chỉ xuất hiện sau đó.
Steven Jeuris

Chỉ cần đọc lại tài liệu SIMULA . Phân lớp thực sự được sử dụng, nhưng không phải là phân nhóm. Bằng cách đọc lại câu trả lời của bạn bây giờ tôi biết ý của bạn là gì. :) Vẫn sẽ thích một tài liệu tham khảo thực tế, nhưng tôi thấy cách bạn đi từ "phụ" xuống thấp hơn.
Steven Jeuris

3
@StevenJeuris: thực sự không phải là cắt giảm rõ ràng; một lớp con thường có nhiều tính năng hơn lớp cha; trong một thế giới thay thế, chúng ta có thể sử dụng thuật ngữ "quảng bá" hoặc "hạ cấp" cho "downcasting" và "upcasting", nếu chúng ta nghĩ rằng một siêu kiểu là một cấp dưới của lớp con vì một lớp con mạnh hơn / có nhiều tính năng hơn hơn siêu lớp. IMO lý do thực sự tại sao các thuật ngữ này được sử dụng chủ yếu là tai nạn lịch sử.
Lie Ryan

3

Tài liệu tham khảo lâu đời nhất tôi tìm thấy là từ tháng 9 năm 1990, trong một bài đăng trên Usenet .

Thư viện được tham chiếu có NIHCL ( có sẵn từ Nhóm bảo quản phần mềm ), chứa mã này ( MIlà "nhiều kế thừa"):

#ifdef MI

#define DECLARE_CASTDOWN(classname) \
    static classname& castdown(Object& p) \
        { return *(classname*)(&p ? p._safe_castdown(*desc()) : 0); } \
    static const classname& castdown(const Object& p) \
        { return *(const classname*)(&p ? p._safe_castdown(*desc()) : 0); } \
    static classname* castdown(Object* p) \
        { return (classname*)(p ? p->_safe_castdown(*desc()) : 0); } \
    static const classname* castdown(const Object* p) \
        { return (const classname*)(p ? p->_safe_castdown(*desc()) : 0); } \

#else

#define DECLARE_CASTDOWN(classname) \
    static classname& castdown(Object& p)           { return (classname&)p; } \
    static const classname& castdown(const Object& p)   { return (const classname&)p; } \
    static classname* castdown(Object* p)           { return (classname*)p; } \
    static const classname* castdown(const Object* p)   { return (const classname*)p; } \

#endif

Cuốn sách mà mã này được bao gồm ( Trừu tượng dữ liệu và lập trình hướng đối tượng trong C ++ ) cũng sử dụng thuật ngữ "castdown".

Thuật ngữ "castdown" dường như cũng có trước "downcast" , ít nhất là trên Usenet.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.