なぜ "I have dog" はおかしいな英語なのか~VBAのクラスモジュールを使ってオブジェクト指向的に英語の世界観を考える~

I have dog.
私は犬を飼っています。
Dogとは何か
この英語、文法的には完全な間違いではありません。しかし、英語話者にはとてもおかしく聞こえます。何故か。
英語のdogは、実際に存在する具体的な「犬」を指しているわけではありません。dog はこの世にあるすべてのモノ(以下、「万物」という)のうち犬と言えるものを抽象的に指し示すマーカー、あるいは万物の中から、犬を取り出すための定義に過ぎません。dogは具体的な犬の実体ではないのです。したがって、dogをhaveするということは現実の世界では成立しないのです。
言葉は世界を分かつ関数
プログラミング的な比喩で説明するなら、dogは万物を入力すると犬が出力される関数と言えます。
Function getDogsArray(EverythingArray() As Variant)
Dim DogsArray() As Variant
'(中略)
'ここに哺乳類か否か、四本足か、ワンと啼くかどうかという犬の定義に基づいた判定が入ります。
getDogsArray = DogsArray
End Function
上の関数getDogsArrayからは、犬と呼べるものすべてが出力されます。その出力結果を英語で言い表すなら、dogs になります。万物の中から犬の定義に合致するものを抽出して得られた集合体、すなわち犬全般ということです。だから、英語話者が「犬が好きです」と言いたい時は、
I like dog.
ではなく、
I like dogs.
と言うのです。
ここでいうdogsは特定の犬に限りません。コーギーもシベリアンハスキーも柴犬も含まれます。「とりあえず犬の類は全部好きです」ということです。日本の犬に限定するならJapanese dogs、目の前の野良犬の一団を指す場合はThese stray dogs というふうにして、一つ下の次元の犬の集合体で表すことができます。
a dog は犬クラスのインスタンス
さて、冒頭の文章 I have dog が間違いだとすると、何が正解なのでしょうか。
お分かりの方はすでにお分かりの通り、I have a dog です。犬を一頭飼ってます、あるいは、ある種の犬を飼っています、ある犬を飼っていますという意味ですね。ようするに何らかの犬を飼ってますということです。
これをクラスモジュールを使ったプログラムで説明するとどうなるでしょう。
名前, 飼い主, 種類、体重、毛色、年齢などのプロパティ、えさを見せると尻尾を振るメソッドなどを備えた犬クラスを適当に定義しておくとします。(クラスの中身は重要ではないのでスルーしてください)
で、メインのプロシージャーでまず、Dogクラス型の変数を宣言
Dim わんこ As Dog
次に、Newする。
Set わんこ = New Dog
これで、犬クラスのインスタンス、名無しのわんこすなわち、a dog のできあがりです。
このわんこは、プーチンの秋田犬かもしれませんし、いま外で啼いている野良犬かもしれません。とにかく正体不明の犬「a dog」です。
次に、この名無しのわんこのプロパティを与えてみます。どうなるでしょうか。
名前 = "ユメ"
飼主 = "プーチン"
種類 = "秋田犬"
体重 = "12kg"
毛色 = "きつね色"
年齢 = 5
わんこ.SetDog (名前, 飼主, 種類, 体、重, 毛色, 年齢)
これで、わんこの正体が特定されました。プーチンが飼っている秋田犬のユメです。
このわんこは、英語では a dog that is named "ユメ" and that is owned by Putin、one of the dogs Pputin owns 等によってプーチンが飼っている犬を特定できます。そして、いったん特定すれば、後はThe dogで特定することができます。
先述のdogsは、DogクラスのインスタンスをCollectionにaddしたものと表現してもいいでしょう。
Dim Dogs As Collection
Set Dogs = New Collection
Dogs.Add わんこ1
Dogs.Add わんこ2
...
以上が英語でもの(オブジェクト)を特定するやり方なのです。
「犬は苦手」「犬が啼いてる」「犬に会いたい」を英語で表現するにはそれぞれdogs, a dog, my dogと言わねばなりせんが、日本語では全部「犬」で片づけることができます。何故なら、犬が何なのかを明示的に説明しなくとも、前後の文脈から判断できる、というのが日本語世界の作法だからです。
しかし、いったい「犬」が何を意味するのか、文脈で判断してくれるプログラミング言語は存在しません。基本的にプログラミング言語を使う際は英語と同じく、どこかの段階で形式的にオブジェクトを定義してやらないといけないのです。
まとめ
このようにコンピュータ言語に触れると、英語的な世界の見方が理解できるようになるようです。また、逆に英語的な考え方ができると、コンピュータ言語の設計思想のエッセンスが割と容易に理解できるようになるようです。