オブジェクト指向言語について

このQ&Aのポイント
  • オブジェクト指向言語についての基本的な概念と、クラス継承の動作について解説します。
  • クラスを継承する場合、extendsなどのキーワードを使用して親クラスのメンバを子クラスに引き継ぐことができます。
  • 継承により、親クラスのフィールドやメソッドを子クラスでも使用することができます。
回答を見る
  • ベストアンサー

オブジェクト指向言語について

オブジェクト指向言語における、クラス継承の動作について ご教授ください。 クラスを継承する場合、extendsなどといったキーワードで継承の動きを 実現させるとおもいますが、継承とは、Aというクラスを丸々包含したBというクラスを作成することをいうのでしょうか? それとも、Aというクラス内にあるpublicやprotectedメンバのみをBというクラスに引き継ぐことをいうのでしょうか? 書籍にやサイトによっては【継承とは継承もとのprivateおよびprotecetd(に準じた)メンバを派生クラスに引き継がせる】という風に解釈できる文面で記述されているものがあります。 継承とは親クラスを拡張した子クラスを作成する と解釈できるような文面で記述された文献もあります。 伺いたいのは、クラス丸ごとを継承するのかそれともpublicおよびprotectedに準じたメンバのみを 継承するのかです。 OOPの思想や、ちょっと詳しいからといってこまごましたことを こたえてくるような方はご遠慮ください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

クラスを丸ごと継承します。 その中で、サブクラスからオーバーライドできるのはpublic、protectedといった スコープのもの、というだけです。 しかしながら、継承とはコピーと同義ではありません。

その他の回答 (4)

回答No.5

そもそも、オブジェクト指向というものを勘違いしているのではないか、と思いますが。 オブジェクト指向の「大げさな能書き」に振り回された犠牲者の一人かと。 適切な解説書で勉強しなおすことをお勧めします。 「継承とは親クラスを拡張した子クラスを作成する」ではなく 「継承とは親クラスを拡張した子クラスを定義する」です。 クラスは作成されるものではなく定義されるものです。 クラスに基づいて作成されるのがオブジェクトです。 文面から察するに、クラス、オブジェクト、それぞれの意味が 理解できていないと思われます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「準じた」とはどのような意味ですか?

回答No.3

>それでは、JAVA PHPあたりの言語でお願いします。 その言語が分かっているなら簡単なテストコードを自分で書いて 挙動テストを自らやらないのは何故?

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

言語のよって違うので何ともいえません。

__vicky__
質問者

補足

それでは、JAVA PHPあたりの言語でお願いします。

関連するQ&A

  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • オーバーロードはオブジェクト指向プログラミングの枠組みで語られるべきか

    一部の書籍やサイトでは、オーバーロードがオブジェクト指向プログラミングの特徴であるかのような記述が見受けられるのですが、私はそれに疑問を感じます。 オーバーライドはクラス・継承に関わるためOOP特有のものであると思うのですが、オーバーロードはクラスとは全く切り離して考えられるからです。 確かにオーバーロードはクラスを作るときに有用な技術ではありますが、例えばC言語のような非オブジェクト指向言語でオーバーロードが使えたとしても、それなりに機能するはずです。 ひょっとしたら 「オーバーロードもオーバーライドもポリモーフィズムだろう」 ↓ 「ポリモーフィズムといえばオブジェクト指向」 のような話の展開でしょうか(いや、さすがに無理があるか…)。 皆様はどうお考えでしょうか。 ご意見お聞かせ下さい。

  • オブジェクト指向の間違いと改善案について

    オブジェクト指向というより オブジェクト指向プログラミングについての間違いと改善案をブログに書いてみました。 http://chaosblogchaos.blog.fc2.com/?no=2 この考え方に間違いがあるでしょうか? 説明不足の点はないでしょうか? よろしくお願いします。 以下ブログの内容 ---------- ■カオス指向(仮) カオス指向(仮)とは、オブジェクトに処理を追加・削除することでオブジェクトの振る舞いに無限性を持たせる試みです。 カオス指向(仮)ではデータが主体となり、木構造で保持します。 (ファイルフォルダで例えると、フォルダがオブジェクト、ファイルがプロパティに当たるイメージです) 処理を追加・削除が可能なことからプロトタイプベースがもっとも近いですが、 オブジェクトが親子関係を持つことと オブジェクトの親子関係から処理が影響を受ける事が異なります。 ●オブジェクトの内容  ・配列か連想配列で子オブジェクトを保持できます。    オブジェクトどうしの強い関係を意味し、親が削除される場合、子も削除される関係にあります。    オブジェクトはルートからの木構造の中に必ず存在する事になります。  ・別途、変数領域を確保する。    処理で使用する値を保持します。    オブジェクトどうしの弱い関係を保持できます。  ・処理を持つ。    オブジェクトに処理を持たせることができるます。    プロトタイプベースと異なる点は、    オブジェクトが処理を持っていても、オブジェクトがその処理をするわけでは無く、自身と子オブジェクトに対して適用され、”認識タイプ”を持つ場合に処理します。  ・”認識タイプ”を持つ。    処理の実行を制御します。認識タイプを含むかどうかで処理を行うかどうかを決定します。    オブジェクトのクラスは”認識タイプ”で実現可能と考えて問題ありません。 ●”認識タイプ” オブジェクト指向なら、 人は歩く、話す、・・・。Aさんは人。Aさんは話す。 カオス指向なら、 歩けるなら歩く、話せるなら話す、・・・。Aさんは歩ける、話せる、・・・。Aさんは話す。(歩ける・話せるを認識するようにした場合) 人は歩く、人は話す、・・・。Aさんは人。Aさんは話す。(人を認識するようにした場合) のどちらでも作成が可能で、 話せるなら話す、・・・。の場合、ウサギAの”認識タイプ”に話せるを追加することで、ウサギAは話せるようになります。 話せるウサギは実用的ではありませんが、 特定ユーザーのアクセスログだけ出力したい場合は、 処理を用意し、対象ユーザーに”認識タイプ”を追加することでログ出力処理を追加することが出来ます。 ●木構造と処理 ユーザー   日本     Aさん     Bさん   アメリカ     Cさん とある場合、 全ユーザーの処理をユーザーに保持 日本用の処理がある場合、日本に アメリカ用の処理がある場合、アメリカに処理を追加します。 そうすることでAさんは日本の処理、Cさんはアメリカの処理が行われます。 ●同一処理による関係 処理には優先順位が存在し、その順番で処理します。 処理A、処理Bとある場合、処理Aの中で元処理として実行します。 処理Aの中で元処理を行わない場合、処理Bは行われません。 ■カオス指向(仮)でどうなるか? ・幾つかのデザインパターンが不要になります。   デコレータ・コンポジット・ステートパターン等 ・多重継承らしきものが出来るようになります。   ※根本から違うので、多重継承らしきものとします。 ・循環問題が発生しませんない   ファイルフォルダのような木構造では循環は起こりえない。 ■オブジェクト指向プログラミングの問題点 オブジェクトにつき1クラスという決め付けが オブジェクト指向プログラミングにはあったのではないかと考えております。 オブジェクト指向では、 オブジェクト:クラス:継承クラスは1:1:1で、1:1:*は条件により可能ですが原則不可能。 カオス指向では、 オブジェクト:クラスは1:*と頭からクラスを複数持たせることで多重継承らしき形が実現可能ということです。 クラスの継承がなくなっていますが、クラスを複数持たせる事とクラスに順番を持たせることで継承が可能です。 オブジェクト指向プログラミングでは、オブジェクトにつき1クラスという決め付けが継承というシステムを作り 多重継承を難しくしたのではないかと考えております。

  • フレームワークの拡張について

    フレームワークの拡張について BaseClass DerivedClass1 extends BaseClass DerivedClass2 extends BaseClass DerivedClass3 extends BaseClass という抽象クラスを継承している派生しているクラスを改造する時に 直接そのフレームワークを書き換えるのは良くないと思うので、 My_DerivedClass1 extends DerivedClass1 というふうに、フレームワークの各派生クラスを継承して メソッドを追加するなり改造するやり方が普通だと思うのですが、 フレームワークの派生クラスではなくて抽象クラス(BaseClass)を書き換えたい場合は どうすれば良いのでしょうか? My_BaseClass extends BaseClass とやってもMy_BaseClassを継承させない限り派生クラスに影響させることはできないですし、 2重に継承させることもできないですし、どうすれば・・・

    • ベストアンサー
    • PHP
  • オブジェクト指向で分からないことが。

    オブジェクト指向で分からないことが。 1.クラスAから、文字列引数を指定して、クラスBがインスタンス化されたオブジェクトを取得する。 (getInstance的メソッド)引数の文字列にマッピングされたオブジェクトを取得する感じ。 2.1.で取得したオブジェクトから、各オブジェクトを取得するメソッドを呼び出し、オブジェクトを取得する。(仮にクラスC) 3.2.で取得したクラスCのメソッドを呼び出す。 このとき、クラスCのメソッド内で、1.で利用された引数を利用したいです。 そもそもクラスCは、1.を経てしか取得されないものの為、再度1.の引数を渡したくありません。 内部的な値なので、スコープpublicのセッターを用意して、クラスA内からの書き換えが出来ては困ります。 こういう場合、どういうクラス設計を行えば良いのでしょうか?

    • ベストアンサー
    • Java
  • C++のクラス設計について

    Webや書籍をあたってみたのですが、なかなか解決しないので こちらで相談させいただこうと思い立ちました。 C++で書かれたプログラムを解析しているのですが、 ドキュメントは外部仕様書のみであとはソースコードだけ、という状態です。 コメントもほとんど書かれていないコードについて、リバースエンジニアリングを する必要があり、手始めにクラス図を作成してみました。 すると、複数のクラスでメンバ変数が重複しているのです。 クラスAに、クラスB・C・Dの変数の一部が宣言されていて、 クラスAとクラスBの間で重複している変数はすべてどちらのクラスもprotectedのstatic、 クラスAとクラスC・Dの間で重複している変数はクラスAではprotectedのstatic、 C・Dではprivateです。 クラスBとC・Dは継承関係にありますが、メンバ変数の重複はありません。 クラスAと他クラスは継承関係がなく、メンバ変数が多数重複しています。 クラスAの変数は20個ほどありますが、9割以上がB・C・Dで宣言されている変数と 重複している状態で、かつstaticのprotectedです。 Cはわかるのですが、C++はほとんど書いたことがありません。 アンチパターンなどもあたってみたのですが、上記のような設計についての記述は 見つけられませんでした。こういったクラス間での変数重複は「あり」なのでしょうか? これで情報が足りているかわかりませんが、何卒よろしくお願い致します。

  • C++ protectedにアクセス不可

    C++でお聞きしたいことがあります。 初心者ですのでご容赦ください。 //基本クラス class a1 { protected: a1(); }; //派生クラス class a2 :public a1 { protected: a2():a1(){}; //継承先以外から作成されたくない int t; }; class a3 : public a2 //a2を継承 { public: a3(); ~a3(); private: a2* a; //a2のポインタを持つ }; a3::a3() { t = 3; a = new a2; //コンストラクタの中でnew } a3::~a3() { delete a; //終わったらdelete } int main(void) { a3 a; return 0; } というソースでa3はa2を継承しています。 ですのでa2のprotectedメンバtにアクセスできるはず。 ここまではいいのですが、 a2のコンストラクタもa3でアクセスでき無いのでしょうか? a3のコンストラクタでnewしようとすると error C2248: 'a2::a2' : protected メンバ (クラス 'a2' で宣言されている)にアクセスできません。 a2::a2' の宣言を確認してください。 というエラーが発生します。 やりたいのはa2のような基本クラスが6つほどあり、 a2のメンバ変数が多いので コンストラクタの引数で指定されたものだけ コンストラクタないでnewしたいのです。 なぜ、できないのか? どうすればnewできるようになるのか…。 非常にお手数ですが、 どなたかご回答いただけませんでしょうか? 長文になりましたが、宜しくお願いいたします。

  • SQLiteについて

    SQLiteのサンプルに、以下のような記述がありましたが extends(派生クラス) ということは元の基本クラスの記述があるということなのでしょうか? https://www.php.net/manual/ja/sqlite3.open.php /** * SQLite3 クラスを継承して __construct を変更し、 * open メソッドで DB を初期化します */ class MyDB extends SQLite3 {

    • ベストアンサー
    • MySQL
  • Webアプリ作成時のオブジェクト指向について

    Webアプリ作成時のオブジェクト指向について質問させてください。 Webアプリはデータベースやテンプレートなどを使って作成することが多いと思いますが、例えばデータベースにPDO、テンプレートにSmartyを用いてHogeクラスを作る場合、 class Hoge { protected $db; protected $tpl; function __construct() { $this->db = new PDO(); $this->tpl = new Smarty(); } } のようにHogeクラスのプロパティに直接PDOとSmartyのインスタンスを持たせるのはありなのでしょうか?ただこの場合だとデータベースやテンプレートを使わずに終了した場合に無駄になってしまうような気がするが気がかりです。 かといって毎回各メソッドの中でnew PDO()やnew Smarty()をするのは面倒な気がするんですが。何かいい方法やコツがあれば教えてください。

    • ベストアンサー
    • PHP
  • 基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

    VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

専門家に質問してみよう