私の知る限り、この用語は継承階層が伝統的にどのように表示されるかから来ており、下部に拡張型、上部に親型があります。
これは、次のleftcastingおよびrightcastingを呼び出す気がしない限り、少し無意味です。
用語がそのままである理由を私は探していませんが、コメントとして大歓迎です。私は最初にアップキャスティングとダウンキャスティングを紹介した人、そしてなぜ彼らがその名前を決めたのかについての参考文献を探しています。
私の知る限り、この用語は継承階層が伝統的にどのように表示されるかから来ており、下部に拡張型、上部に親型があります。
これは、次のleftcastingおよびrightcastingを呼び出す気がしない限り、少し無意味です。
用語がそのままである理由を私は探していませんが、コメントとして大歓迎です。私は最初にアップキャスティングとダウンキャスティングを紹介した人、そしてなぜ彼らがその名前を決めたのかについての参考文献を探しています。
回答:
基本的down-
及びup-cast
論理の続きであるsubtype
(subclass
OOPで)とsupertype
(superclass
例えば、元の型の下方に位置する構造型の古典的な表現、それぞれ) - sub
タイプ。
用語subtyping
を検索すると、以下が見つかります(Wikipedia):
プログラミング言語でのサブタイピングの概念は、1960年代にさかのぼります。Simulaの派生物で導入されました。サブタイピングの最初の正式な扱いは、1980年に暗黙の変換を正式化するためにカテゴリー理論を使用したJohn C. ReynoldsとLuca Cardelli(1985)によって与えられました。
したがって、他の多くのことと同様に、ここでは漠然とここで「Simula派生物」(おそらく初期のOOP言語)と呼ばれるものに由来しています。ただし、Simulaにはすでにsubclassの概念がありますが、OOPのすべてのプロパティを備えているわけではありません。
私が見つけた最も古いリファレンスは、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では「ダウンキャスト」よりも古いようです。