スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

初心者のためのC#プログラミング本格入門79 - 共通した性質を持つオブジェクトを作ろう

 この記事は、初心者のためのC#プログラミング本格入門78の続きです。前回は、テストおよびデバッグのモチベーションを上げる方法について解説しました。今回は、同じプログラムを何度も書かなくても済むようになる、非常に便利かつ強力なC#の機能を解説します。
 前回言及したように、沢山のオブジェクトに共通したプログラムを書くのは大変です。何故ならば、プログラムを変更したり、追加したりする時煩雑かつ間違えやすい作業をしなくてはならないからです。
 例えば、100個のオブジェクトがあるとします。これらのオブジェクトに1つのプロパティを追加したい場合、数行の同じプログラムを100回書かなくてはなりません。カット&コピーすればよいと思うかもしれませんが、それだと漏れが生じる危険性があります。99個のオブジェクトに共通するプログラムを追加した場合、後の1個のオブジェクトは間違っている事になります。その他にも色々なトラブルが考えられます。特に複数の人がプログラミングをしている場合、間違えずにそういった煩雑な作業をするのは大変困難かつ危険です。
 もちろんC#には、そういった状況に対処するための強力な機能があります。それは継承です。継承を使うと、1つのオブジェクトに、複数のオブジェクトに共通したプログラムを定義する事が可能となります。今はまだピンとこないかもしれませんが、学習を進めれば継承の強力さが分かります。実際に継承の機能を使ってみましょう。
 最初にTestオブジェクトを作って下さい。

//テストオブジェクトに共通した定義
class Test
{
    //テスト件数
    private int testCount;
    public int TestCount
    {
        get { return this.testCount; }
    }

    //エラー件数
    private int errorCount;
    public int ErrorCount
    {
        get { return this.errorCount; }
    }
}

このTestオブジェクトを作ったら、次はMultiAnalyzerTestがTestオブジェクトで定義した要素を使う事を宣言します。

class MultiAnalyzerTest : Test
{

緑色の部分がその宣言です。これでTestオブジェクトの定義が使える準備が出来ました。これを「○○オブジェクトを継承する」と表現します。ソリューションのビルド(F6)をして下さい。すると次の様な警告が表示されます。

'MultiAnalyzerTest.ErrorCount' は継承されたメンバー 'Test.ErrorCount' を非表示にします。非表示にする場合は、new キーワードを使用してください。

 これは、MultiAnalyzerTestオブジェクトで同じプログラムがあるという事を指しています。ErrorCountプロパティに関するプログラムと、TestCountプロパティに関するプログラムを、MultiAnalyzerTestから消して下さい。
 再度ビルドすると今度は・・・

'Test.errorCount' はアクセスできない保護レベルになっています。

というふうなエラー文が表示されます。これは、errorCountフィールドをMultiAnalyzerTestからアクセス出来ないという事を示しています。この問題を解決するには・・・

//テストオブジェクトに共通した定義
class Test
{
    //テスト件数
    protected int testCount;
    public int TestCount
    {
        get { return this.testCount; }
    }

    //エラー件数
    protected int errorCount;
    public int ErrorCount
    {
        get { return this.errorCount; }
    }
}

privateキーワードをprotectedキーワードに変更します。再度ビルドして下さい。先ほどのエラーが消えた事が確認できます。
 今度はAnalyzerTestオブジェクトもTestオブジェクトから継承するように変更しましょう。

class AnalyzerTest : Test
{

今度はビルドしても警告もエラーも表示されません。安心してテストの個数とエラーの個数をカウントするプログラムを追加しましょう。
 これで全てのテスト件数とエラー件数が確認できます。Mainプログラムを修正しましょう。

class TestProgram
{
    static void Main()
    {
        //MultiAnalyzerオブジェクトをテストする
        //省略

        //Analyzerオブジェクトをテストする
        AnalyzerTest test = new AnalyzerTest();
        test.ExecuteAllTest();

        //テストに関する情報を表示
        int errorCount = 
            multiTests.ErrorCount + test.ErrorCount;
        System.Console.WriteLine("***** エラー件数:" 
            + errorCount + " *****");
        int testCount = 
            multiTests.TestCount + test.TestCount;
        System.Console.WriteLine( "***** テスト件数:"
            + testCount + " *****" );

        //デバッグ実行しやすいようにする
        //省略
    }
}

変更したプログラム周辺だけ掲載しています。両テストのエラー件数とテスト件数を合わせて表示しているだけです。デバッグ実行(F5)するとテスト件数が少しだけ増えている事を確認できます。
 継承は凄く便利な機能です。ですが継承の効果はこれだけではありません。少しずつ解説していきます。なお、Testオブジェクトの方を親オブジェクト、AnalyzerTestオブジェクトとMultiAnalyzerTestオブジェクトの事を子オブジェクトと呼びます。頻繁に使われる表現なので覚えて下さい。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。