R.Tanaka.Ichiro's Blog

主にC# な話題です

目次

Blog 利用状況

ニュース

R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6

http://blogs.wankuma.com/rti/archive/2007/08/02/88399.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門5

http://blogs.wankuma.com/rti/archive/2007/07/31/87955.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門4

http://blogs.wankuma.com/rti/archive/2007/07/30/87742.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門3

http://blogs.wankuma.com/rti/archive/2007/07/26/87105.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門2

http://blogs.wankuma.com/rti/archive/2007/07/25/86988.aspx
R流、一瞬でわかる.NETオブジェクト指向プログラミング入門1

の続きです。

どこからフォローすれば良いのかわからないので、先頭から順に行ってます。

今回は

オーバーライドする

というテーマです。

早速、毎度おなじみのR・田中一郎クラスのC#でのコードを再度登場させます。


public class R・田中一郎 {
  public string 会員番号 { get { return "34";  }}
  public string 名前    { get { return "R・田中一郎"; }}
  public string 年齢    { get { return "18"; }}
  public string 職業    { get { return "IT関係"; }}
  public string 印象    { get { return "素敵だし爽やか"; }}
  public void  自己紹介(){
    Console.Writeline(
      "オブジェクト指向ファンの皆さん、こんにちは。" +
      "わんくま会員番号" + this.会員番号 + "番の" + this.名前 + "です。" +
      "年齢は、" + this.年齢 + "才。職業は、" + this.職業 "です。" +
      "今日は、オブジェクト指向ファンの皆さんを前にして、" +
      this.印象 + "な僕が、オブジェクト指向について語るということで、" +
      "些かガクブルな状態ではありますが、早速はじめたいと思います。"
    );
  }
}


この自己紹介メソッドですが、良く見るとオブジェクト指向ファンの皆さんと書いてあります。
これでは、別の機会で自己紹介するときには利用できません。
しかし、以前にも言った通り、オブジェクト指向プログラミングというものは、コード資産を徹底的に再利用するできることがメリットのひとつです。
それに、自己紹介メソッドを除いたメンバは、そのまま流用できそうです。

そこで、前回説明した継承を使って、R・田中一郎クラスを継承した新しいクラスを作って、自己紹介メソッドを上書きしてしまえば良いですね。
以下は、R・田中一郎クラスを継承したR・田中二郎クラスで自己紹介メソッドをオーバーライドしたコードです。


public class R・田中一郎 {
  public string 会員番号 { get { return "34";  }}
  public string 名前    { get { return "R・田中一郎"; }}
  public string 年齢    { get { return "18"; }}
  public string 職業    { get { return "IT関係"; }}
  public string 印象    { get { return "素敵だし爽やか"; }}
  public void virtual 自己紹介(){
    Console.Writeline(
      "オブジェクト指向ファンの皆さん、こんにちは。" +
      "わんくま会員番号" + this.会員番号 + "番の" + this.名前 + "です。" +
      "年齢は、" + this.年齢 + "才。職業は、" + this.職業 "です。" +
      "今日は、オブジェクト指向ファンの皆さんを前にして、" +
      this.印象 + "な僕が、オブジェクト指向について語るということで、" +
      "些かガクブルな状態ではありますが、早速はじめたいと思います。"
    );
  }
}

public class R・田中二郎  : R・田中一郎 { 
 public void override 自己紹介(){
    Console.Writeline(
      “構造化プログラミングファンの皆さん、こんにちは。" +
      "わんくま会員番号" + this.会員番号 + "番の" + this.名前 + "です。" +
       "年齢は、" + this.年齢 + "才。職業は、" + this.職業 "です。" +
      "今日は、オブジェクト指向ファンの皆さんを前にして、" +
      this.印象 + “な僕が、構造化プログラミングについて語ります。”
    );
  }
}


まずは、R・田中一郎クラスを見て下さい。
先ほどの説明のように、自己紹介メソッドは、継承されたクラスで独自に設定されることが多いだろうことが予想できます。
C# では、そういったメンバにバーチャルというキーワードを記述します。

これによって、継承したクラスでは自己紹介メソッドを必要に応じてオーバーライドができます。

投稿日時 : 2007年8月7日 13:56

Feedback

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6 2007/08/08 0:00 通り*

あまり関係ないけど~
「演算子のオーバーロード」という表現だけど、私いつも違和感を感じてます。
効果としてはオーバーライドですよね。
言語的にはオーバーライドではないのでしょうけど~

それと全然関係ないけど、こんなクラスあったら嫌だなぁw
何故こんなことができるようになってるのかな...
private class Test
{
  public static bool operator ==(Test v1, string v2)
  { return true; }
  public static bool operator !=(Test v1, string v2)
  { return !(v1 == v2); }

  public static bool operator ==(string v1, Test v2)
  { return false; }
  public static bool operator !=(string v1, Test v2)
  { return !(v1 == v2); }
}
private void button1_Click(object sender, EventArgs e)
{
  Test test = new Test();
  MessageBox.Show((test == "a").ToString());
  MessageBox.Show(("a" == test).ToString());
}

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6 2007/08/08 0:03 通り*

「違和感を感じる」という表現に違和感を感じたのでぐぐってみると、やっぱり頭痛が痛いと同じみたいorz

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6 2007/08/08 13:16 R・田中一郎

>効果としてはオーバーライドですよね。

そう言われてみれば確かにそうですね。

>それと全然関係ないけど、こんなクラスあったら嫌だなぁw
>何故こんなことができるようになってるのかな...

オブジェクトにとって、何がそうであるべきなのかは、オブジェクトの設計者じゃないとわからなくて、そういう場合は好き勝手やってね、ってことなんでしょうかね。

>「違和感を感じる」という表現に違和感を感じたのでぐぐってみると、やっぱり頭痛が痛いと同じみたいorz

最高にベストっていうのはどうなんでしょうか?

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6 2007/08/08 14:23 凪瀬

演算子にとっては前後の型によって挙動の変わるオーバーロードですよね?

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6 2007/08/08 18:21 通り*

>>Rさん
>最高にベストっていうのはどうなんでしょうか?
「エリートの中のエリート」とか「もっとも優れた会社の中の一つ」みたいな~w

>>凪瀬さん
>演算子にとっては前後の型によって挙動の変わるオーバーロードですよね?
「オーバーロード」という表現がやはり適切だよというご指摘ですね?
それとも、(test == "a")と("a" == test)のように前後させて結果が異なることがあっても、オーバーロードに過ぎないから自然だよというご指摘でしょうか?

前者の場合ですが、"=="を考えた場合、元々は参照の比較という効果を独自の実装で上書きするので、オーバーライドがしっくりすると思いました。
"+"とかは元々に定義がなくて、何をプラスするかによって実装を変えるので、やっぱりオーバーロードかもだけど、"+"が定義されたクラスを継承し、そこで"+"を再定義すればオーバーライドのような...
でも他の型も"+"できるようにすればオーバーロードだし...

そもそもoverrideってどんな意味(定義)だったか忘れてしまっていましたので、ヘルプを見てみました。
 override:抽象実装や仮想実装を拡張したり修飾したりする際に必要
元々のが「抽象実装」でもないし「仮想実装」でもないので、オーバーライドはやっぱりダメですね...

違うと思うけど仮に後者の場合ですが、そのような挙動にできることの必要性が思いつきませんw
#また読解力がないと怒られそうorz

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6 2007/08/08 21:30 凪瀬

オーバーライドは既存の実装の上書き。
オーバーロードは引数の型の違いで別のメソッド実装を呼び出す仕組み。

演算子の場合はいわゆるシンタックスシュガーという奴で、
hoge.+(piyo);
のところを
hoge + piyo;
という簡易記法で書いているんだよ、メソッドとかと概念的には一緒だよ、
という前振りがあって、この+の引数の型が何のときにどう動く?という
オーバーロードなんだ、というように私は理解しています。

このあたりは本職じゃないんで自信ないです。
えぴ先生なら詳しそうだなぁ。

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6 2007/08/08 23:14 通り*

私の間違いを訂正...
>"+"が定義されたクラスを継承し、そこで"+"を再定義すればオーバーライドのような...
ここだけど、同じ引数の型では再定義できないので、やっぱりオーバーロードかな。

>演算子の場合はいわゆるシンタックスシュガーという奴
あ、その説明、わかりやすいです。甘いの頂きます~

>このあたりは本職じゃないんで自信ないです。
BARの人ですからねw
いつもおいしいカクテル(度数は高いのに甘口…濃い内容なのにわかりやすい)、ありがとうございます~

# R流、一瞬でわかる.NETオブジェクト指向プログラミング入門8 2007/08/10 15:05 R.Tanaka.Ichiro's Blog

R流、一瞬でわかる.NETオブジェクト指向プログラミング入門8

# re: R流、一瞬でわかる.NETオブジェクト指向プログラミング入門6 2007/08/10 15:23 R・田中一郎

凪瀬 さん

>演算子の場合はいわゆるシンタックスシュガーという奴で、

これは勉強になりました。
なるほどねー。

-----------------------------------
通り* さん

>「エリートの中のエリート」とか「もっとも優れた会社の中の一つ」みたいな~w

これ、よく使っている人をみますね。

> override:抽象実装や仮想実装を拡張したり修飾したりする際に必要

そうなんですよね。

>いつもおいしいカクテル(度数は高いのに甘口…濃い内容なのにわかりやすい)、ありがとうございます~

うまいこといいますね(カクテルだけにw)

# R流、一瞬でわかる.NETオブジェクト指向プログラミング入門9 2007/08/14 17:19 R.Tanaka.Ichiro's Blog

R流、一瞬でわかる.NETオブジェクト指向プログラミング入門9

# R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12 2007/08/28 13:56 R.Tanaka.Ichiro's Blog

R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12

# R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12 2007/08/28 14:40 R.Tanaka.Ichiro's Blog

R流、一瞬でわかる.NETオブジェクト指向プログラミング入門12

# R流、一瞬でわかる.NETオブジェクト指向プログラミング入門13 2007/08/31 14:30 R.Tanaka.Ichiro's Blog

R流、一瞬でわかる.NETオブジェクト指向プログラミング入門13

# KsjtXvvoVpmCASlJDai 2012/01/07 14:05 http://www.luckyvitamin.com/p-32919-good-n-natural

A unique note..!

タイトル
名前
Url
コメント