クラス(オブジェクト指向) 単語

オブジェクトシコウニオケルクラス

2.6千文字の記事
  • twitter
  • facebook
  • はてな
  • LINE

クラスとは、オブジェクト指向の中核をなす概念である。

概要

クラスとは、オブジェクト指向プログラミングにおいて、生成されるオブジェクトの特徴を取り決めたものをす。

オブジェクトクラスを元に生成される。これをインスタンス化と呼ぶ。クラスの持つそれぞれのデータ構造、振る舞いには、外部からのアクセス範囲を定義することができる。クラスは要素の継承を行うことが出来る。これを汎化と呼ぶ。

継承されたクラスは継承元のクラスから見て、子クラス(または、サブクラス)と呼ばれる。また、継承元のクラスクラス(またはスーパークラス)と呼ばれる。子クラスは、クラスが持っている要素をすべて受け継いでいる。これが継承である。

静的クラス

static classについてはインスタンスを参照

クラス・インターフェース・抽象クラス

以下ではダイヤモンド継承の問題を取り上げ、その解決策としての観点からインターフェースと抽クラス(プログラミング言語によっては呼称が異なることあり)について述べる。クラスメソッド・継承・リスコフの置換原則などの用についてはオブジェクト指向の記事の「詳細」以下の部分を読むなどして理解していることを前提とする。

リスコフの置換原則の実装

リスコフの置換原則の最も単純な実装は、継承した元のクラスの動作をそのまま使用することである。

それだとメソッドの追加くらいしかできずクラスとの差別化が難しいので、実際のプログラミング言語では継承した元クラスメソッド矛盾のない範囲で変更することができる(オーバーライド)。

だが変更できるというだけで、継承した元のクラスの性質を引き継げる範囲内で変更するべきということには変わりない。

ダイヤモンド継承問題

前述の通りサブクラス(子クラス)はスーパークラス(クラス)の性質を継承する。

今回はオブジェクト指向の記事にあった動物園の例は忘れて、以下のような性質(クラス)を考えよう。

  • 回避する人: 前方に障害物があると回避して進む。

クラピカ理論によれば、人は左右に分かれがあると、左を選ぶらしいので、以下のようにサブクラスを作成する。

  • のままに、回避する人: 前方に障害物があると左に回避して進む。
  • の邪な、回避する人: 前方に障害物があると右に回避して進む。

なお、説明のための例示なので、必ず決まった方向に回避するものとする。異論は認めない

生物学の分類だと一つ生物が複数の種に同時に属するということはないのだが、上記のような分類だと複数の分類(クラス)に所属することもあり得る。ここで、以下のようなクラスを考える。

  • の邪かつ本のままに、回避する人: ?!

さて、このクラスに属する人は前方に障害物があると左右どちらに回避して進むのだろうか。

このように複数のクラスを継承した結果、リスコフの置換原則と矛盾する結果が生じることがある。

継承関係を図式化するとダイヤモンドになることからダイヤモンド継承と呼び、オブジェクト指向の特色である継承の大きな問題点とされている。

回避する人
のままに、回避する人 の邪な、回避する人
の邪かつ本のままに、回避する人

意味論的に、「の邪」と「本のまま」という性質は両立しないという反論はありえるが、プログラミング言語理系がそのような識別を行うことはない。

解決法

によって対応が異なるが、おおまかな対処方法は以下のようなものがある。

継承の優先順位を決める

メソッドを継承する際のクラスの優先順位を決めれば、継承するメソッドを一つに特定することは可である。

ただ、継承関係が網ののように複雑になった時に優先順位を決められるのか、そして、その規則で決定した優先順位は意味論的にも適切なのかという問題が残る。

実装を継承させない

もう一つの解決法は、具体的なことを決めてしまうことで矛盾が確定的になるのだから、具体的なことは決めずにあいまいなままにしておこうという、いささか乱暴な考えである。以下のように曖昧な定義となる。

  • のままに行動し、回避する人: 前方に障害物があると本のままに回避して進む。
  • の邪な、回避する人: 前方に障害物があるとの邪に回避して進む。

そして、「の邪かつ本のままに、回避する人」が左右どちらに回避するかは、このクラスの用途に応じて継承する側が責任を持ってめて設計し直すのである。

例えば、かなりいい加減に書くが、

  • の邪かつ本のままに、回避する人: 機嫌の悪い時は右に回避して進む。それ以外の時は左に回避して進む。


のような感じである。

勘の良い人は気づいたかも知れない。そう、実装責任丸投げである。

かが責任を負わなければならない以上、抽的な段階よりは、具体的な段階で実装したほうが実際の要件と乖離してしまう危険が少ないので、丸投げだから責任ということはなく、むしろ適切と言っていいくらいである。

インターフェース

さて、このように具体的な内容を決めない抽的な動作定義インターフェースという用で呼ぶ。インターフェースダイヤモンド継承問題を生じないので、複数継承することが可である。

この呼称はクラスプログラム部品と見た時に、クラスの機(メソッドプロパティ)に「インターフェース」を介してアクセスすることから来ている。実際にプログラミングする段階になると、クラスに「インターフェース」を通じてアクセスしていることが実感できるはずなので、用に納得できない人はコードを書いてみるしかない。

単一継承

解決方法はもう一つある。

実装を全く継承しないのでは、オブジェクト指向の特長を生かせない。
もう一度よく考えてみよう。二つ以上のクラスを継承するから矛盾するのであって、一つだけなら矛盾を生じない。そこでクラスの継承は一つまでで、残りの性質はインターフェースで継承するという方式を採用したのが単一継承である。

抽象クラス

この時、実装一部はインターフェースの様に未定にしておいて、継承可な部分だけ実装するという、クラスインターフェースの中間的なものも考えることができる。これが抽クラスである。

クラスも、実装を持つ部分がダイヤモンド継承問題に抵触するので、単一継承しか出来ない。

インターフェースと抽クラス実装未定の部分があるのでインスタンス化できないという制約がある。

関連動画

関連項目

この記事を編集する

掲示板

掲示板に書き込みがありません。

おすすめトレンド

ニコニ広告で宣伝された記事

記事と一緒に動画もおすすめ!
さくらみこ[単語]

提供: 夏蜜柑

もっと見る

急上昇ワード改

最終更新:2024/06/05(水) 07:00

ほめられた記事

最終更新:2024/06/05(水) 07:00

ウォッチリストに追加しました!

すでにウォッチリストに
入っています。

OK

追加に失敗しました。

OK

追加にはログインが必要です。

           

ほめた!

すでにほめています。

すでにほめています。

ほめるを取消しました。

OK

ほめるに失敗しました。

OK

ほめるの取消しに失敗しました。

OK

ほめるにはログインが必要です。

タグ編集にはログインが必要です。

タグ編集には利用規約の同意が必要です。

TOP