Q&A

  • 클래스 사용 질문입니다. (초보)

안녕하세요, 델파이를 한창 배우고 있습니다.

그런데 지금 제 실력으로는 해결할수 없어서 이렇게 도움글을 올리네요..^^;;

고수분들 많은 가르침 받겠습니다.

 

제가 구현하고자 하는 것은 은행 클래스 입니다.

현재 계좌 클래스는 구현했는데, 1개의 계좌만을 가지고 있는 상황입니다.

그래서 은행 클래스를 만들어서 그속에 계좌를 여러개 만들어 사용할수 있도록 하고 싶은데 뜻대로 잘 안되네요...

은행/계좌클래스를 따로 만들어서 해야하는건지, 은행클래스를 상속을 받아 계좌클래스를 만들어야 하는건지...감이 안잡혀요...

현재 계좌생성이나 잔고조회/입금/출력 기능은 계좌클래스에 구현이 된 상태입니다.

소스를 올리니 살펴봐주시고 , 은행클래스를 어떻게 만들어야 하는지, 계좌클래스가 어떻게 은행클래스에 속해서 여러개의 계좌를 만들수 있는지 너무너무~~~ 궁금합니다.

 

부탁드립니다. 아래는 이미 구현한 계좌클래스 입니다. 이것을 은행클래스를 만들어 속에 넣고 싶은데...ㅠㅠ

 

unit Bank;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Contnrs, Dialogs;

type
  EBankException= class(Exception);
  EBankAccountException= class(EBankException);
  EAccountDepositException= class(EBankAccountException);
  EAccountWithdrawalException= class(EBankAccountException);
  EDepositZeroInput= class(EAccountDepositException);
  EDepositMinusInput= class(EAccountDepositException);
  EWithdrawalZeroInput= class(EAccountWithdrawalException);
  EWithdrawalMinusInput= class(EAccountWithdrawalException);
  EWithdrawalInsufficientFunds= class(EAccountWithdrawalException);

  TTransType = (tsCreate, tsDeposit, tsWithdraw);

 

  TTransObj= class
  private
    FDateTime: TDateTime;
    FTrans: TTransType;
    FAmount: Integer;
    FTransBalance: Integer;
  public
    constructor Create(datetime: TDateTime; transtype: TTransType;
      input: Integer; transbalance: Integer);
  published
    property DateTime : TDateTime read FDateTime write FDateTime;
    property Trans : TTransType read FTrans write FTrans;
    property Amount : Integer read FAmount write FAmount;
    property TransBalance : Integer read FTransBalance write FTransBalance;
  end;

 

  TAccount= class
  private
    FBalance: Integer;
    FTransObjList: TObjectList;
    FTransStrList: TStringList;
  public
    constructor Create(init: Integer);
    destructor Destroy;
    function GetBalance: Integer;
    procedure Deposit(input: Integer);
    procedure Withdraw(input: Integer);
    procedure SetTransaction(input: Integer; transtype: TTransType);
    function GetTransaction(index: Integer): TTransObj;
    procedure PrintMiniStatement(ministatement: TStringList);
  end;

 

implementation

{ TTransObj }

{ TTransObj.Create
  This routine is Constructor. }

constructor TTransObj.Create(datetime: TDateTime; transtype: TTransType;
  input: Integer; transbalance: Integer);
begin
  Inherited Create;
  FDateTime := datetime;
  FTrans := transtype;
  FAmount := input;
  FTransBalance := transbalance;
end;

{ TAccount }

{ TAccount.Create
  This routine is Constructor. }

constructor TAccount.Create(init: Integer);
begin
  Inherited Create;
  FBalance := init;
  FTransObjList := TObjectList.create(true);
  FTransStrList := TStringList.Create;
  SetTransaction(init, tsCreate);
end;

{ TAccount.Destroy
  This routine is Destructor. }

Destructor TAccount.Destroy;
begin
  Inherited Destroy;
  FTransObjList.Free;
  FTransStrList.Free;
end;

{ TAccount.GetBalance
  This routine allows you to get current balance. }

function TAccount.GetBalance: Integer;
begin
  result := FBalance;  // return current balance
end;

{ TAccount.Deposit
  This routine allows you to deposit on account. }

procedure TAccount.Deposit(input: Integer);
begin
  if input = 0 then
    raise EDepositZeroInput.Create('Error! Invalid deposit input: Zero')
  else
  if input < 0 then
    raise EDepositMinusInput.Create('Error! Invalid deposit input: Negative')
  else
    FBalance := FBalance + input; // add input to current balance
  SetTransaction(input, tsDeposit);
end;

{ TAccount.Withdraw
  This routine allows you to Withdraw from account. }

procedure TAccount.Withdraw(input: Integer);
begin
  if input = 0 then
    raise EWithdrawalZeroInput.Create('Error! Invalid Withdrawal input: Zero')
  else
  if input < 0 then
    raise EWithdrawalMinusInput.Create('Error! Invalid Withdrawal input: Negative')
  else
  if input > FBalance then
    raise EWithdrawalInsufficientFunds.Create('Error! Insufficient funds')
  else
    FBalance := FBalance - input; // subtract input from current balance
  SetTransaction(input, tsWithdraw);
end;

{ TAccount.SetTransaction
  This routine allows you to store each transaction. }

procedure TAccount.SetTransaction(input: Integer; transtype: TTransType);
begin
  FTransObjList.Add(TTransObj.Create(Now, transtype, input, GetBalance));
end;

{ TAccount.GetTransaction
  This routine allows you to get each transaction. }

function TAccount.GetTransaction(index: Integer): TTransObj;
begin
  result := FTransObjList[index] as TTransObj;
end;

{ TAccount.PrintMiniStatement
  This routine allows you to get Mini Statement. }

procedure TAccount.PrintMiniStatement(ministatement: TStringList);
const
  StrTransNames : array [TTransType] of String
    = ('Created', 'Deposited', 'Withdrew');
var
  i: Integer;
begin
  for i := 0 to FTransObjList.Count-1 do
  begin
    ministatement.Add(format('%s %s with %d. your balance is %d',
      [DateTimeToStr(GetTransaction(i).DateTime),
      StrTransNames[GetTransaction(i).Trans],
      GetTransaction(i).Amount,
      GetTransaction(i).TransBalance]));
  end;
end;
                       

1  COMMENTS
  • Profile
    이정욱 2012.08.05 10:51

    계좌 클래스에서 사용하신 TList 클래스를 응용하시면 되겠네요.

    은행 클래스를 따로 만드시고 그 안에 TList로 계좌 리스트를 넣으시면 될듯 합니다.

    은행 클래스에 단순하게 계좌클래스들만 가지고 있는것이라면 딱히 계좌클래스를 따로 만드실 필요 없이 그냥 리스트로 처리하셔도 될듯 하구요.