クラスが他のクラスを所持する

クラスが他のクラスを所持している場合があります。例えば、ここでは、本クラスと本棚クラスの例をみてみます。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

  // 本クラス
  TBook = class(TObject)
  private
    FBookName: string;
  public
    constructor Create(bookName: string);
    procedure GetName;
  end;

  // 本棚クラス
  TBookShelf = class(TObject)
  private
    FBookArray: array[0..2] of TBook; // 本クラスを所持します
  public
    constructor Create;
    destructor Destroy; override;
    procedure ShowBook;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBook }

constructor TBook.Create(bookName: string);
begin
  FBookName := bookName;
end;

procedure TBook.GetName;
begin
  ShowMessage(FBookName);
end;

{ TBookShelf }

constructor TBookShelf.Create;
var
  i: Integer;
begin
  for i := Low(FBookArray) to High(FBookArray) do
  begin
    // 本棚クラスが生成される時に、本クラスも生成します。
    case i of
      0: FBookArray[i] := TBook.Create('First_Book');
      1: FBookArray[i] := TBook.Create('Second_Book');
      2: FBookArray[i] := TBook.Create('Third_Book');
    end;
  end;
end;

destructor TBookShelf.Destroy;
var
  i: Integer;
begin
  // 本棚クラスが破棄されるときに、本クラスも一緒に破棄します。
  for i := Low(FBookArray) to High(fBookArray) do
    fBookArray[i].Free;

  inherited;
end;

procedure TBookShelf.ShowBook;
var
  i: Integer;
begin
  for i := Low(FBookArray) to High(FBookArray) do
    FBookArray[i].GetName;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  BookShelf : TBookShelf;
begin // ←ここにブレークポイントを設置して
      // F7 キーを押していってください。

  // 本棚クラスを生成
  BookShelf := TBookShelf.Create;
  BookShelf.ShowBook;
  BookShelf.Free; // 破棄
end;

end.

このように、あるクラスが、別のクラスを所持することもあります。また、 コメントに書いたように、ブレークポイントを設置して、F7 キーを押していってください。一文ずつ実行していくので、その様子が、良く分かると思います。

これだけでは、少しつまらないので、本のタイトルを Edit に入力して、ListBox に本棚の内容を表示させるようにしてみましょう。一旦、終了して、[ ファイル | 新規作成 | アプリケーション ] を選択してください。(Button * 2、Edit * 1、ListBox * 1)

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

  TBook = class(TObject)
  private
    FBookName: string;
  public
    constructor Create(bookName: string);
    function GetName: string;
  end;

  TBookShelf = class(TObject)
  private
    FBookCount: Integer; // 現在、何冊の本があるか
    FBookArray: array[1..5] of TBook;
  public
    constructor Create;
    destructor Destroy; override;
    procedure InsertBook(bookName: string);
    procedure ShowBook;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  BookShelf: TBookShelf;

{ TBook }

constructor TBook.Create(bookName: string);
begin
  FBookName := bookName;
end;

function TBook.GetName: string;
begin
  Result := FBookName;
end;

{ TBookShelf }

constructor TBookShelf.Create;
begin
  FBookCount := 0; // 現在、本は本棚にありません。
end;

destructor TBookShelf.Destroy;
var
  i: Integer;
begin
  for i := 1 to FBookCount do
    FBookArray[i].Free;

  inherited;
end;

procedure TBookShelf.InsertBook(bookName: string);
begin
  if FBookCount = 5 then
  begin
    ShowMessage('本棚には、もう入りきりません。');
    exit;
  end;

  Inc(FBookCount); // 本が増えました。
  FBookArray[FBookCount] := TBook.Create(bookName);
  ShowMessage(bookName + 'を本棚に入れました。');
end;

procedure TBookShelf.ShowBook;
var
  i: Integer;
begin
  if FBookCount = 0 then
  begin
    ShowMessage('現在、本棚に本はありません。');
    exit;
  end;

  Form1.ListBox1.Items.Add('『  本棚  』');

  for i := 1 to FBookCount do
    Form1.ListBox1.Items.Add(FBookArray[i].GetName);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  BookShelf := TBookShelf.Create;
  Edit1.Text := '';
  Button1.Caption := '本を本棚に';
  Button2.Caption := '本棚を表示';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  BookShelf.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Edit1.Text = '' then
  begin
    ShowMessage('本のタイトルを入力してください。');
    exit;
  end;

  BookShelf.InsertBook(Edit1.Text);
  Edit1.Text := '';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ListBox1.Clear;
  BookShelf.ShowBook;
end;

end.

「本を本棚に」 ボタン(Button1)を押す事で、Edit に入力した『本の名前』が Book クラスの FName フィールドに代入され、そしてそのオブジェクトが BookShelf(本棚)クラスのフィールドである FBookArray に格納される事になります。「本棚を表示」ボタンで本棚に入っている本を列挙します。


up next
Last update: 2002/10/18