ダウンキャストとアップキャストという用語は誰が決めたのですか?


8

私の知る限り、この用語は継承階層が伝統的にどのように表示されるかから来ており、下部に拡張型、上部に親型があります。

これは、次のleftcastingおよびrightcastingを呼び出す気がしない限り、少し無意味です

水平継承階層

用語がそのままである理由私は探していませんが、コメントとして大歓迎です。私は最初にアップキャスティングとダウンキャスティングを紹介した人、そしてなぜ彼らがその名前を決めたのかについての参考文献を探しています。


1
自明ですが、実際にこれらの用語を使用している人は誰もいません。あなたがたは参照がありますか?IOW:「あなたはより少ないことができるオブジェクトにアップキャストし、より多くをすることができるオブジェクトにダウンキャストします。」[引用が必要]
タスク

1
私は、安全にアップキャストすることを検討します(少なくとも、開始タイプのメンバーのサブセットを持つことが保証されているタイプに移動します)。より安全->より良いので、あなたが使う典型的な推論は機能します。[/意見]
yannis

2
そして、さらに重要なことです。犬/猫の画像を入手したところから記事読みましたか?そうでない場合、それは私の以前のコメントをサポートします。アップキャスティングは失敗することがないのでより安全であり、ダウンキャスティングは失敗する可能性があります。また、アップキャストによって抽象化レベルが高くなることを補足します(そうすることで、覚えやすくなります)。
yannis

1
アップキャストダウンキャストは古い意味を持っているので、それらの起源を探すのはそれほど簡単ではありません。しかし、おそらくそれらの意味がOOPの言葉に影響を与えたのでしょう。しかし、Ngramは1980年と1995年頃に大幅な増加を示しています。ダウンキャストへの最初の言及は、1992年のC ++の文献にあります...
Hugo

回答:


3

基本的down-及びup-cast論理の続きであるsubtypesubclassOOPで)とsupertypesuperclass例えば、元の型の下方に位置する構造型の古典的な表現、それぞれ) - subタイプ。

用語subtypingを検索すると、以下が見つかります(Wikipedia):

プログラミング言語でのサブタイピングの概念は、1960年代にさかのぼります。Simulaの派生物で導入されました。サブタイピングの最初の正式な扱いは、1980年に暗黙の変換を正式化するためにカテゴリー理論を使用したJohn C. ReynoldsとLuca Cardelli(1985)によって与えられました。

したがって、他の多くのことと同様に、ここでは漠然とここで「Simula派生物」(おそらく初期のOOP言語)と呼ばれるものに由来しています。ただし、Simulaにはすでにsubclassの概念がありますが、OOPのすべてのプロパティを備えているわけではありません。


私の質問で述べたように、「用語は、継承階層が伝統的にどのように表示されるかに由来します」。これは、「sub」と「super」が「up」と「down」として表示される理由を説明していません。すでにSIMULAをコメントとして追加しています。
Steven Jeuris

1
うーん...だから、「サブ」と「ダウン」の間に接続が表示されないのですか?字幕、サブゼロ、サブリミナル、その他の一般的な英単語についてはどうですか?
Alexander Galkin、2011

1
追記:SIMULA では、継承の概念は当初「連結」と呼ばれ、後に「接頭辞」と呼ばれていました。SIMULAのドキュメントを読んだときに、サブタイピングまたはスーパータイピングについて読んだことを覚えていません。これは後になって登場した用語だと思います。
Steven Jeuris

SIMULAのドキュメントを読み直しただけです。サブクラスは実際に使用されていますが、サブタイプは使用されていません。あなたの答えを読み直すことで、私は今あなたが何を意味しているかを知っています。:)それでも実際の参照を好むでしょうが、私は「サブ」からどのように下がるかを確認します。
Steven Jeuris

3
@StevenJeuris:実際にはそれほど明確ではありません。サブクラスには通常、親クラスよりも多くの機能があります。別の世界では、スーパークラスがサブクラスの下位であると考える場合、サブクラスの方がより強力である/より多くの機能を持っていると考える場合、「昇格」または「降格」という用語をそれぞれ「ダウンキャスト」および「アップキャスト」に使用している可能性があります。スーパークラスより。IMOこれらの用語が使用される本当の理由は、主に歴史的な事故です。
リーライアン

3

私が見つけた最も古いリファレンスは、Usenetの投稿で1990年9月のものです。

そこで参照されるライブラリはNIHCL(Software Preservation Groupから入手可能)であり、このコード(MI「多重継承」)が含まれています。

#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

このコードが含まれている本(C ++のデータ抽象化とオブジェクト指向プログラミング)でも、「キャストダウン」という用語を使用しています。

「キャストダウン」という用語は、少なくともUsenetでは「ダウンキャスト」よりも古いようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.