// インデクサを追加して、フェイルソフトな配列を改良する
using System;
namespace Chapter07All
{
class FailSoftArray
{
int[] a; // 配列への参照
public static int Length; // 変数Lengthはpublic staticに変えてみました。
public static bool ErrFlag; // 直前の操作の結果を表すフラグ 同じくstaticに変えてみました。
// サイズを指定して配列を作る
public FailSoftArray(int size)
{
a = new int[size];
Length = size;
}
// FailSoftArrayオブジェクトのためのインデクサ
public int this[int index]
{ //←FailSoftArrayに対するインデクサ
// getアクセサ
get
{
if (ok(index))
{
ErrFlag = false;
return a[index];
}
else
{
ErrFlag = true;
return -1;
}
}
// setアクセサ
set
{
if (ok(index))
{
a[index] = value;
ErrFlag = false;
}
else ErrFlag = true;
}
}
// インデックスが配列の上限・下限の範囲内ならtrueを返す
private bool ok(int index)
{
if (index >= 0 & index < Length) return true;
return false;
}
}
// 改良されたフェイルソフトな配列
class ImprovedFSDemo
{
public static void Main()
{
FailSoftArray fs = new FailSoftArray(5);
int x;
// 失敗を表示しない
Console.WriteLine("Fail quietly.");
for (int i = 0; i < (FailSoftArray.Length * 2); i++) //クラス変数のアクセスはクラス名で修飾
fs[i] = i * 10; //←インデクサのsetアクセサが呼び出される
for (int i = 0; i < (FailSoftArray.Length * 2); i++)
{
x = fs[i]; //←インデクサのgetアクセサが呼び出される
if (x != -1) Console.Write(x + " ");
}
Console.WriteLine();
// 今度はエラーを表示
Console.WriteLine("\nFail with error reports.");
for (int i = 0; i < (FailSoftArray.Length * 2); i++)
{
fs[i] = i * 10;
if (FailSoftArray.ErrFlag)
Console.WriteLine("fs[" + i + "] out-of-bounds");
}
for (int i = 0; i < (FailSoftArray.Length * 2); i++)
{
x = fs[i];
if (!FailSoftArray.ErrFlag) Console.Write(x + " ");
else
Console.WriteLine("fs[" + i + "] out-of-bounds");
}
}
}
}
本の説明を見ると、LengthとErrFlagはメンバ変数で無くて、クラス変数の様だったので、staticにしてみました。正常そうには動きました。アクセス方法が違ってきます。インスタン変数であればfs.Lengthとなるのですが、クラス変数の場合はFailSoftArray.Lengthと変わります。