クラス、オブジェクト、インスタンス、メソッドに
ついて教えていただけないでしょうか?

今現在の自分の認識では、乗り物を例にすると、
「乗り物」という大枠がクラス。それを、たとえば
飛行機なり電車なり船なり、より具体的にした
ものがインスタンス=オブジェクト。
その具体化したものの挙動、動作(走るとか飛ぶとか)
がメソッド、という理解です。

ただ、これだとオブジェクトとインスタンスを
同じものとして見てしまっているので、この2つの
違いを明確に説明しろと言われると困ってしまいます。

インスタンスとオブジェクトの違いを明確にした上で
うまく伝えられる方法があれば、ご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (9件)

最初は「オブジェクト=インスタンス」で良いと思います。



ただ、いろいろと細かい話が出てきていますので、私の理解している範囲でアドバイスしたいと思います。

〔オブジェクト〕
設計段階で使う用語です。
クラスオブジェクトとインスタンスオブジェクトの2種類あり、通常単にオブジェクトと言えばインスタンスオブジェクトのことを指すようですが、クラスオブジェクトのことを指すこともあるので注意が必要です。

〔クラス〕
実装段階で使う用語です。
クラスオブジェクトの実装が「クラス」です。
クラスオブジェクトとクラスは完全に一致します。

〔インスタンス〕
実装段階で使う用語です。
インスタンスオブジェクトの実装が「インスタンス」です。
インスタンスオブジェクトとインスタンスは、必ずしも一致しません。
たとえば、C++ であるクラスのインスタンスを new して、ポインタ変数に代入した場合を考えてみます。
インスタンスオブジェクトに相当するのは、そのポインタ変数そのものですよね。
しかし、インスタンスはポインタ変数が指している先、つまりメモリ領域に確保された実体そのものです。

と、まあ、細かいことを言えば、こんな話になりますが、ここまでこだわって話をすることは、まずないでしょう。

設計レベルでは「オブジェクト」、実装レベルでは「インスタンス」と使い分けておけば、とりあえず間違いはないでしょうし、両者を混同したところで話が通じないことはないと思います。

# 私なんか、最初「インスタンスはオブジェクトのちょっとかっこいい
# 呼び方だ(?)」などと思っていましたし。。。
# いや、なんとなく響きがかっこよく聞こえたもので。。。

とりあえずは、こんな感じでいかがでしょうか。
    • good
    • 2

せっかく抽象的なものの考え方をしているわけだから、数学を使えばいいんじゃないかなあ、ってふと思ったんですけど。



まず始めに「違い」についてですが、手短に言えば、以下のようになりますね。

「オブジェクトもクラスもインスタンスもみんな同じもの。じゃあ、厳密にはどう違うのかというと、『クラス』というのは、抽象的な概念を表すオブジェクトのことで、『インスタンス』というのは具体的な実体を表すオブジェクトのこと。」

集合で言えば、「オブジェクト」の中に、「クラス」と「インスタンス」が入っている、といった感じですね。だから、別の表現を使えば、十分条件ではあるけれども、必要条件ではない、という風になると思います。

今度は「明確な説明」についてですが、以下、中学数学で習う図形を元に、オブジェクト指向の概念を解説していきます。

平行四辺形や二等辺三角形もまた、全てオブジェクト。じゃあ、「平行四辺形」オブジェクトというのは、どういう風に定義されているのかというと、「平行四辺形」クラスの中に、「辺」フィールドや「角度」フィールド、はたまた「等しい」メソッドや「平行である」メソッドなどを用いて、決められているわけですね。(ここまでが、プログラム設計。)
そのクラスにより、例えば、初期値を[a=c=2,b=d=3]として「平行四辺形E」インスタンスが新たに作られたり、初期値[A=C=60°,B=D=120°]とする「平行四辺形F」インスタンスが新規に作成されたりするわけですね。(この部分が、プログラミング。)

昨日も、Javaカテゴリ内で、「抽象クラスってなに?」みたいな質問があったのですが、先程、覗いてみると、もう閉め切っていたので、以下にそっちの方も書き記しておきます。

以上の考え方を利用すれば、抽象クラスやインターフェイスなども簡単ですね。例えば、「長方形」クラスや「ひし形」クラスが必要な場合、先に「四角形」抽象クラスを作成しておけば、後はそれを継承するサブクラスをそれぞれ作成することで、「再利用化」を実現できますね。
もちろん、そんなややこしいことをすれば、クラスが増えるだけだし、大きな「長方形」クラスや、長々とした「ひし形」クラスでもいいじゃないか、と思う人がいるかもしれません。ただ、この後にまた、「台形」クラスが必要になったとしましょう。そしたら、抽象クラスがない場合は、また一から冗長的なプログラムを作成していかなくてはなりません。それが、抽象クラスがある場合は、同様にして、それに関するサブクラスを作成するだけでいいわけですね。それと同時に、このように共通とするものを抜き出して「抽象化」しておけば、コーディング時だけでなく、品質面や後々の保守・運用時にも信頼性が高まる事につながります。

>それにしても、オブジェクト指向の解説って、設計レベルのみの解説や実装レベルのみの解説は見かけますが、両者をつなぐ解説ってあまり見ないような気がします。
お勧めとしては、やはりUMLやデザインパターンでしょうか。これらは、オブジェクト指向を元にした技術なので、必然的にオブジェクト指向的なものの考え方も身に付きますから。
    • good
    • 4

No7 ency です。



メソッドについてですが、案外オブジェクト指向で一番やっかいなものかもしれません。

「オブジェクトに送信したメッセージの応答がメソッド」ということになるでしょうか。。。

…何がなにやら、わからないですよね。

メッセージは「オブジェクトに対して要求する処理」のことです。

メソッドは「要求された処理の実現方法」のことです。
# 「応答」というのはそういう意味です。

…いまいちピンときませんか?

設計レベルでは、上記の話だけで事足りると思いますが、いざ実装となったときにどうするの?という話になりますよね。

実装レベルでは、使用する言語の仕様に依存するようです。
C++ や Java に限って言えば、「メッセージを送信する=メソッドがコールされる」という理解で良いと思います。
C++ と Java では、メッセージ送信とメソッドコールは完全に一致します。

hoge.message();

というのは、hoge に対して message() というメッセージを送信する場合の書式になります。

では、このメッセージ処理の実現方法、つまりメソッドはどのように実装すればよいのかといえば…ふつうに以下のように実装しますよね。

# hoge のクラスは Hoge とします。

void Hoge::message( void )
{
/* 何かの処理 */
}

この Hoge::message() の実装を「メソッド」と呼ぶわけです。

C++ や Java の場合、メッセージ送信の処理自体が、メソッドをコールする処理になっています。

ちなみに、C++ ではメッセージとかメソッドとかいう用語は使わずに「メンバ関数」と呼んでいますよね。
ま、より言語実装に近い呼び方になっている、というくらいにとらえておけば良いと思います。

ま、オブジェクトとインスタンスの話といっしょで、ここまで突っ込んで話をすることは、まずないと思います。

う~ん、あまりわかりやすくないかも。。。
余計に混乱させてしまっただけだったりして (?)

それにしても、オブジェクト指向の解説って、設計レベルのみの解説や実装レベルのみの解説は見かけますが、両者をつなぐ解説ってあまり見ないような気がします。

だから、「犬」に「鳴け」というメッセージを送ったら「ワン」という応答が返ってきた、などという分かったような分からないような説明が横行することに(以下略)。
    • good
    • 2

私の経験でいわせて頂くと


クラスその他の概念は概念から入ると失敗します。
私はこれで1年くらいを無為に過ごしました。

結局のところCなりJAVAなりのプログラムを実際に動かして、
あとで概念のつじつまを合わせていく方がいいようです。

なお、概念としてはデザインパターン関係の本が優れていると
多くの人が指摘しています。
    • good
    • 0

●クラス


 ある「もの」がどのようなものであるのかを説明した説明書。

●インスタンス
 「クラス」という説明書に基づいて実体化されたもの
 だからインスタンスは、元にしたクラスの性質を持っている。

 質問文の例でいうと、「ナンバーxxxの電車」のように「これ」と指でさせるもの。


●オブジェクト
 私の感じ方では、場面によってクラスの意味だったり、インスタンスの意味だったりしています。

 私見ですが理由は、

 昔、UMLが出来る前、様々な方法論でそれぞれが勝手に用語を定義していました。
 「オブジェクト」もその1つで、方法論によっては「クラス」の意味だったり「インスタンス」の意味だったりしていました。

 その名残なのではないかと思っています。
    • good
    • 0

#1の方も書いていますが「飛行機」や「電車」はクラスですね。

「乗り物」クラスを基本クラスとするとサブクラスや派生クラスとも呼びます。また「乗り物」クラスは抽象クラスでもあります。余談ですが。

さてオブジェクトとインスタンスの違いですが
オブジェクト…クラスに属する実体
インスタンス…メモリ上にデータを与えたオブジェクト
と分ける事が多いようです。
つまり「インスタンス」は抽象的な単語「オブジェクト」をプログラムと言う世界を強く意識した言い方かなぁと自分では認識しています。経験則ですので外しているかも知れませんが、オブジェクト指向にだけ特化した本では「インスタンス」と言う単語をあまり見かけませんし、プログラミング言語の本では「インスタンス」の方を頻繁に見かけます。
    • good
    • 0

クラスとインスタンスを考えるときには、「インスタンスは複数存在する(できる)」という意識が大切です。



例えば、世界に犬が一匹しかいないとしたら、クラス(犬という種族)と、「ぽちという名前の犬」の違いを説明するのは、かなり大変でしょう。それが、「犬の性質」なのか、「ぽちの性質」なのか区別に困りますから。
※逆に言えば、インスタンスが複数出てこないと、オブジェクト指向の、目だった効果というのもあまり目には見えないものです。

インスタンスは、複数あるものです。
「たま」や「みけ」や。
ですから、クラスとインスタンスを考えるときには、複数あるものがインスタンス、それの共通した部分をくくりだすのがクラスという意識で眺めてみてください。
※普通は、「クラス」という鋳型から、「インスタンス」という具体的なものを生成するという説明をしますが。

メソッドは、インスタンスの行動様式を決めるものです。
これも、通常は、「クラスに属するインスタンスの共通した行動様式」を決めるという理解です。
ただし、(複数ある)インスタンスは、それぞれ個性を持っていますから、同じクラスに属していても、同じ行動をするとは限りません。

あと、オブジェクト指向だと、「メッセージ」という概念もあります。
メソッドとは、「メッセージによって起動される行動」です。

class 犬 { };

犬 pochi();

pochi.hoeru();

というのの、hoeru(); は、ポチへのメッセージです。
C++では、それに対して、hoeru() という関数を実行するので、メッセージとメソッドの区別が明確でないこともありますが。

あるところで読んだ例。

女性クラスの、「奥さん」インスタンスに、「キスをする」というメッセージを送ると、良い雰囲気になる。

女性クラスの、「隣のお姉さん」インスタンスに、「キスをする」というメッセージを送ると、殴られる。
    • good
    • 0

がると申します。


えっと。変にたとえ話をするとかえって話がゆがみますので、たとえ話抜きでプログラムチックに。
C/C++カテゴリなので、C++の流儀で記述をしてみます。

まずクラスとは「型の定義」です。また、クラス内にある各々の関数をメソッドと呼びます。

具体的には、例えば
class foo {
public:
bool set_XX(const string& s) { data_ = s; }
string get_XX(void) { return data_; }

private:
string data_;
};

なんて感じの時に、fooがクラス名で、set_XXyやget_XXがメソッドになります。
またこの定義全体を指してクラスと呼びます。

次に。
実際にこれらを用いるときは、メモリ資源を用いて実態を作ってやる必要があります。
foo f;
foo* f = new foo();
こんな感じでしょうか。これらによって確保された「メモリ上にあるもの」を、インスタンスとかオブジェクトとか呼びます。
どちらかというとインスタンスのほうがより「正しい」言い方ですが。

で、
> ただ、これだとオブジェクトとインスタンスを
> 同じものとして見てしまっているので、この2つの
> 違いを明確に説明しろと言われると困ってしまいます。
の部分ですが。

インスタンスは「実体」です。これは概念に対して実際に使うことが出来るもの、というニュアンスがあります。
一方で、オブジェクトとは元々「対象物」を指し示します。なので、プログラム中というよりは設計中によく飛び交う単語ですね。ちなみにインスタンスはプログラム中によく飛び交う単語です。

そうですねぇ。例えば会員系のサイトの設計をしていたとします。
設計的に「会員オブジェクト」というのが必要であることはすぐにご理解いただけるかと思います。これは「会員」という対象物を指している概念です。設計中は「会員オブジェクト」に対する挙動などが設計されていくことになるかと思います。
一方で、プログラミングに入りますと。まず「会員クラス」の定義があり、それに対してコード中で「会員クラスのインスタンス」を生成(new)、そのインスタンスに対してメソッドを発行したりなんだり…といった事をすることでコーディングが突き進んでいくかと思います。

オブジェクトってのはかなりモヤついた概念なのですが。
こんな感じで少しは理解の一助になりますでしょうか?
    • good
    • 0

乗り物と飛行機、電車という関係は、クラス、サブクラスの説明によくつかわれます。


(意図によってはクラスとインスタンスの関係にもなるかもしれませんが)
クラスとインスタンスの説明としては
クラス:犬に対して、ポチ、シロなどがインスタンスというのがよいかと思います。
理想の世界の犬というものがあり、
犬は食べたり、走ったりする。これがメソッド。
メソッドはクラスで定義しますよね。
それを現実世界に具現化したものがインスタンス、ポチ。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

QOracleでインスタンスを複数にしたい

初めて質問させていただきます。
Oracleの初心者です。
仕事でOracleインスタンスを複数にして欲しいと言われ方法を
検索したのですが、なかなか見つかりません。。
どうしたら、インスタンスを複数にできますか?
初歩的(?)なことで恥ずかしいのですが分からなくて困っています。
回答よろしくお願い致します。

Aベストアンサー

old インスタンスから new インスタンスを作成する場合以下のような流れでできるかと思います。

1.old インスタンスを起動して CREATE CONTROLFILE 文のトレースを出力。
alter database backup controlfile to trace;
2.old インスタンスを停止。
3.old インスタンスのファイルを new インスタンスを作成する場所にコピー。
4.old インスタンスの初期化パラメータファイルをコピーして new インスタンス用の初期化パラメータファイルを作成。
5.new インスタンス用のパスワードファイルを作成。
6.new インスタンス用のログ出力ディレクトリ (bdump とか) を作成。
7.ORACLE_SID を "new" にセットしてデータベースを nomount で起動。
8.1 で出力されたトレースの "old" を "new" に書き換えて実行。
9.データベースを resetlogs オプション付きでオープン。

Qクラス内のクラスから1つ目のクラスのメソッドよ呼び出しがうまくいきません^^;

こんにちは、ちょっと分かりにくい質問なんですが。

class c1
{
  int k1();

  class c2
  {
    int k2();
  };
};

と言うのがあったとします。
そこで、k2の関数の内部でk1を呼び出したいのですが、

int k2()
{
  return c1::k1();
}

見たいな事をすると、「静的でない関数の呼び出しが正しくありません」とエラーが出てしまい、コンパイルできません・・・

だからといってk1をc1の外に出してしまうとc1の変数にアクセスできなくなってしまうため、それはできません。

何かいい方法はないでしょうか・・・解決策をお待ちしていますm(_ _)m

Aベストアンサー

クラスの設計がちょっと駄目です。
c2からc1::k1にアクセスしたいなら、
c2がc1のポインタを持つか、k1をstaticメンバにします。
ちなみにstaticメンバはCの関数と同じただの関数でメンバ変数にアクセスできません。
またこの場合c2を内包する意味がありません。
class c1
{
  int k1();
  int k2();
};
でいいのです。

return c1::k1();
これが何故だめか、ですが
c1は実体がありません。その為staticメンバ(静的な関数)である必要があるのです。

class c1
{
  static int k1();
  class c2
  {
    int k2();
  };
};
int c1::k1()
{
return 0;
}
int c1::c2::k2()
{
  return c1::k1();
}

一応これでコンパイルは通りますが。

QOracleでのDBインスタンス作成方法を教えて下さい

現在、VC++とOracle(8.1.7)を使っての業務アプリケーション開発に携わっています。
が、VC++もOracleも開発時に必要に応じて知識をつけて来たため、基本的な理解が乏しく、一度自分だけでアプリケーションを作ってみようと考えています。

そこでまずDBインスタンスを作ろうと思い、Oracle8.1.7をフルインストールしたのですが、どのツールを使ってインスタンスを生成すれば良いのかもわかりません。

この辺りの事がわかる方、教えて下さい。
また、この辺りの技術をわかりやすく説明しているHPや書籍などありましたら紹介して下さると助かります。

よろしくお願いしますm(_ _)m

なお使用OSはWin2000です。

Aベストアンサー

こんにちわ。

> どのツールを使ってインスタンスを生成すれば良いのかもわかりません。
インストール時に、初期データベースは作成しなかったんですか?
インストール後でも、「Database Configuration Assistant」を使えばGCI から
インスタンス/Database を作成してくれます。
oradim コマンドを使用すれば、手動でもインスタンスの管理できますが、
慣れていないのであればGUI からやられた方が簡単だと思います。

データベースの作成方法については、
「Oracle8i for WindowsNT 管理者ガイド」の第6章に説明
されています。
上記マニュアルは、ユーザ登録が必要 (無料) ですが、
OTN Japan にPDF 形式で公開されていますので、
こちらからDownload されてみてはいかがでしょうか?

参考URL:http://technet.oracle.co.jp/

Qテンプレートクラス内のテンプレートクラス(インナークラス)のメソッドを実装ファイルで定義したい

現在、ヘッダファイル内で下記のようなクラスを宣言・定義しています。

// test.h
template < typename T1 >
struct A
{
  template < typename T2 >
struct B
  {
    B( A const& arg ) { ... }
  };
};

テンプレートクラスが入れ子になっていて、Bのコンストラクタが引数としてAを取っています。
しかし現状ではコンパイルがとんでもなく遅くなってしまうので、
Bのコンストラクタは宣言のみとし、別途実装ファイル(test.cpp)に定義を書きたいと思っています。

ところがメソッドのシグネチャをどう書けばよいのか分からなくなってしまいました。

苦し紛れに

// test.cpp
template < typename T1, typename T2 >
A<T1>::B<T2>::B( A<T1> const& arg ) { ... }

などと書いてみましたが、違うようです。
解決方法はありますでしょうか?

環境はVC7.1かVC8でコンパイルできればよいです。
よろしくお願いいたします。

現在、ヘッダファイル内で下記のようなクラスを宣言・定義しています。

// test.h
template < typename T1 >
struct A
{
  template < typename T2 >
struct B
  {
    B( A const& arg ) { ... }
  };
};

テンプレートクラスが入れ子になっていて、Bのコンストラクタが引数としてAを取っています。
しかし現状ではコンパイルがとんでもなく遅くなってしまうので、
Bのコンストラクタは宣言のみとし、別途実装ファイル(test.cpp)に定義を書きたいと思っています。

ところが...続きを読む

Aベストアンサー

template < typename T1 >
struct A {
 template < typename T2 >
 struct B {
  B( A const& arg );
 };
};

template<typename T1>
template<typename T2>
A<T1>::B<T2>::B( A<T1> const& arg ) { }

int main() {
 A<int> a;
 A<int>::B<char> c(a);
}

QORACLEのスキーマーを別のORACLEインスタンスにコピーする方法

いつもお世話になっています。

表題の件なのですが、ORACLEのスキーマのコピーをおこないたいのですが、方法がわかりません。

いろいろ調べたのですが、テーブル単位のコピーは発見できたのですがスキーマごとというものはみつかりませんでした。

ご存知のかたがいらっしゃったらご教授お願いいたします

Aベストアンサー

スキーマ単位のデータ移行(コピー)であれば、エクスポートとインポート機能が利用できます。やり方はotn.oracle.co.jpからドキュメントがダウンロードすればかいてあると思います。

[Oracle9iなら]
http://otn.oracle.co.jp/document/products/oracle9i/920/general.html#sql
Oracle9i データベース・ユーティリティ リリース2(9.2)

[Oracle8iなら]
http://otn.oracle.co.jp/document/products/oracle8i/817/general.html#basic
Oracle8i ユーティリティ・ガイド リリース8.1

[Oracle8なら]
http://otn.oracle.co.jp/document/products/oracle8/80/general.html
Oracle8 Server ユーティリティ リリース8.0

あたりに書いてあると思います。

Q内部クラスのインスタンスを外部クラスが保持する場合

C++での内部クラスの宣言の仕方なのですが、例えば、

class Outer
{
private:
   class Inner;
public:
   Outer();
   ~Outer();
};
class Outer::Inner
{
public:
   Inner();
   ~Inner();
};

のように単純に内部クラスが宣言されているだけならば、
その具体的な定義を外側に書くことは可能と思うのですが、

class Outer
{
private:
   class Inner
   {
   public:
      Inner();
      ~Inner();
   };
public:
   Outer();
   ~Outer();

   Inner inner; //内部クラスのインスタンス
};

のように外部クラスが内部クラスのインスタンスを保持していた場合には、
上記のようにインスタンス作成より上で外部クラスの宣言内に内部クラスの定義を書かないと、
コンパイルが通らない(VC++2008)と思います。具体的な中身がないままインスタンスを
作っているのでエラーを吐く理由もわからないでもないですが、
見易さ的に上の例のようにかけないのかなとも思ったりします。

インスタンスを外部クラスに持たせずともどうとでもなるのですが、
あえて上のようなことをしたくなった場合には下のような方法で記述する以外ないのでしょうか?

C++での内部クラスの宣言の仕方なのですが、例えば、

class Outer
{
private:
   class Inner;
public:
   Outer();
   ~Outer();
};
class Outer::Inner
{
public:
   Inner();
   ~Inner();
};

のように単純に内部クラスが宣言されているだけならば、
その具体的な定義を外側に書くことは可能と思うのですが、

class Outer
{
private:
   class Inner
   {
   public:
      Inner();
      ~Inner();
   };
public:
   Outer();
   ~Outer();

   Inner in...続きを読む

Aベストアンサー

見やすさ、というよりは、ヘッダの記述量や変更回数を減らしてコンパイル時間を短縮するために前方宣言を使うことはあります。その際、値型でなくポインタ型を使うことになります。


class Outer
{
public:
Outer();
~Outer();
private:
class Inner;
Inner* m_pInner;
};

// 以下はヘッダでなく実装ファイルに記述する。
class Outer::Inner
{
public:
Inner();
~Inner();
};

Outer::Outer()
: m_pInner()
{
m_pInner = new Outer::Inner();
}

Outer::~Outer()
{
delete m_pInner;
}


スタック(値型)でなくnewヒープを使うことで、いくぶん効率は低下します。また、ヒープの解放忘れといったヒープ特有のバグが混入しないように気をつける必要があります。

Innerの詳細が分からない段階で値型として埋め込むことができないのは、コンパイラにとってOuterの定義に必要なsizeof(Inner)の計算が実行できないからです。ポインタであればInnerがどのような型であれsizeof(Inner*)は常に一定(ILP32で4バイト、LP64/LLP64で8バイト)のため、前方宣言さえあればOuterは定義できることになります。

見やすさ、というよりは、ヘッダの記述量や変更回数を減らしてコンパイル時間を短縮するために前方宣言を使うことはあります。その際、値型でなくポインタ型を使うことになります。


class Outer
{
public:
Outer();
~Outer();
private:
class Inner;
Inner* m_pInner;
};

// 以下はヘッダでなく実装ファイルに記述する。
class Outer::Inner
{
public:
Inner();
~Inner();
};

Outer::Outer()
: m_pInner()
{
m_pInner = new Outer::Inner();
}

Outer::~Outer()
{
delete m_pInner;
}


スタック(値型)でな...続きを読む

Qインスタンス追加

現在Oracle10gデータベースにインスタンスが作成してあります。
そこにもう一つインスタンスを追加したいのですが既存のインスタンスを停止する必要があるのでしょうか?
ご回答よろしくお願い致します。

Aベストアンサー

追加インスタンス分の空きメモリがあるのであれば、
停止する必要はありません。

Qクラスのインスタンス名をクラス内で取得できますか?

クラスのインスタンス名をクラス内で取得できますか?

今VC++6.0を使っています。例として下記のクラスのコンストラクタで
CTest::CTest() { TRACE("%s",typeid(this).name()); }
としておいて、
別なクラスで CTest testInst; を生成すると
デバッグエリアに 「class CTest *」 と表示することはできました。
これが出来るのなら、インスタンス名 testInst をCTestクラスの内部から
取得することは出来ないのかと思ったのですが、
取得することは可能なのでしょうか?

Aベストアンサー

オブジェクトの定義時に、名前をコンストラクタに渡すようなマクロでも作れば実現できなくもないのかもしれませんが、一般的には無理です。
また、そもそも名前のないオブジェクト、例えば、newで割り付けたオブエジェクトや一時オブジェクトはどうするのでしょうか?

Qoracle9iをまるごと新しいPCに移したいのですが、どうすれば?

新しいPCを購入したのでいろいろと移行作業をやってます。oracle9iのスタンダードを入れていたので、それも移行しようと思っています。
普通に考えて、新しくoracleをインストールした後、前と同じ設定のインスタンスを作成し、エクスポートしたファイルをインポートする、みたいな感じだと思うのですが、
結構手間が掛かるのでうんざりしてきてます。
データだけでなくインスタンスをまるごと移行する、なにか便利な手立てはあったりしないでしょうか?
どうか宜しくお願いいたします。

Aベストアンサー

私もこの質問を興味深く拝見していたのですが、なかなか回答がつかないようですね。

質問者様も書いていらっしゃるとおり、やはり
・ORACLEインストール&初期設定
・インスタンス&ユーザー作成
・エクスポートファイルのインポート
は避けられないのではないかと思います。

ただ、これらの作業を簡単にするツールが出ているみたいです。実際に使ったわけではないので、使い心地を報告できなくて申し訳ありませんが、参考までに。
(ちなみにうちはインスタンスを作るときは流したSQLのスクリプトを保存してます。移行するときはそのとき使ったSQL文をそのまま流してます)

DBRestore:
http://www1.ocn.ne.jp/%7efkingdom/junk/dbrestoreinfo.html

Oracle Import/Export :
http://www.vector.co.jp/soft/winnt/business/se353753.html

Q[Obj-c]元クラスからサブクラスのメソッド

Objective-Cの勉強をしています。

ClassAは元クラス(スーパークラス)です、
ClassB1、B2はClassAを継承(サブクラス)しています。

ClassAとClassB1にはiMethodというメソッドが存在します。
最下部にソースと実行結果があります。



●そこで質問なのですが、
 ClassAのインスタンスにClassB1のインスタンスをセットすると、
 同じ名前のメソッドがあるだけでなぜClassB1のメソッドが呼ばれるのでしょうか?
 (下記ソースの[bangai iMethod]; の部分です。)

 ClassB1のインスタンスを渡すとClassAのインスタンスが
 ClassB1のメソッドを使用できる理由がわかりません、
 継承しているとはいえ型が違うものを参照渡しできる理由も今ひとつわからないです。

 またこれはどういう機能を言うのでしょうか?
 (例えば ポリモーフィズム、動的バインディングなど)





★ソース
------------------------------------------------------------------------------

#import <Foundation/Foundation.h>

// ClassA
@interface ClassA : NSObject
{

}

@end

@implementation ClassA

-(void) iMethod
{
NSLog(@"スーパークラスのインスタンスメソッドです。\n");
return;
}

@end


// ClassB1
@interface ClassB1 : ClassA
@end

@implementation ClassB1

-(void) iMethod
{
NSLog(@"サブクラスのインスタンスメソッドです。\n");
return;
}

@end


// ClassB2
@interface ClassB2 : ClassA
@end

@implementation ClassB2
@end


int main(int argc, const char * argv[])
{

@autoreleasepool {

// insert code here...
ClassB1 *instance_B1 = [[ClassB1 alloc]init];
ClassB2 *instance_B2 = [[ClassB2 alloc]init];

[instance_B1 iMethod];
[instance_B2 iMethod];

// 親には子のクラスが入れられる
ClassA *bangai = instance_B1;

[bangai iMethod];


}
return 0;
}

------------------------------------------------------------------------------

★実行結果
サブクラスのインスタンスメソッドです。
スーパークラスのインスタンスメソッドです。
サブクラスのインスタンスメソッドです。

Objective-Cの勉強をしています。

ClassAは元クラス(スーパークラス)です、
ClassB1、B2はClassAを継承(サブクラス)しています。

ClassAとClassB1にはiMethodというメソッドが存在します。
最下部にソースと実行結果があります。



●そこで質問なのですが、
 ClassAのインスタンスにClassB1のインスタンスをセットすると、
 同じ名前のメソッドがあるだけでなぜClassB1のメソッドが呼ばれるのでしょうか?
 (下記ソースの[bangai iMethod]; の部分です。)

 ClassB1のインスタンスを渡すとClassAのインス...続きを読む

Aベストアンサー

実装、というかアーキについてはとりあえず参考URLでも読んでみてください。
これはC++の話ですが、Objective-Cでもそう違いはないと思いますので。

参考URL:http://www.kab-studio.biz/Programing/PragmaTwice/Main/365.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング