全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1172
推到 Plurk!
推到 Facebook!

在子類別中如何引用父類別中的變數

尚未結案
danielx2000
一般會員


發表:29
回覆:33
積分:22
註冊:2002-09-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-24 13:43:55 IP:61.218.xxx.xxx 未訂閱
請教各位; 因為我第一次用OO的觀念來coding,有一些地方還搞不清楚,請不吝指證    我宣告一個父類別Tsprite, 然後宣告一個子類別Tstudent 來繼承Tsprite並宣告成陣列型態TSpriteArray ,我的問題是,我在父類別中實作了一個 draw 繪出學生圖形的方法, 並在子類別的 students.shownameflag=true 時才一並秀出學生姓名, 那在這個例子中,Tsprite and Tstudent 類別要如何宣告才能讓Tsprite.draw 類別方法能看到Tstudent 類別內宣告的FShowNameFlag 變數??    是不是要射程全域變數才行?    Thanks    -=======================================  
     TSprite = class
private
  FStudentID: string; // student Id
  FStudentName: string;
  FClassName: string; // class name
...
public
  constructor Create; virtual;
  destructor Destroy; override;
  procedure Draw(x,y:integer;Canvas: TCanvas); virtual; // 繪製角色
...
end;    TSpriteArray = array[0..TILE_NUM_Y - 1, 0..TILE_NUM_X - 1] of TSprite; // 所有學生    // Student 類別
TStudent = class(TSprite)
private
   FShowNameFlag: boolean;
   FStudent: TSpriteArray;
   procedure Set_ShowNameFlag(const Value: boolean);
 public
   property ShowNameFlag:boolean read FShowNameFlag write Set_ShowNameFlag;
    property Sprite[X, Y: Integer]: TSprite read GetSprite; default;
...    end;    var
  Students: TStudent;    // 所有學生    implementation
...
procedure TSprite.Draw(x,y:integer;Canvas: TCanvas);
begin
...
 //繪出角色圖形
...
 if  ShowNameFlag  then  Canvas.textout(x,y,text);//秀出學生姓名;
// 要如何宣告,才能看到 Tstudent下的 ShowNameflag變數
...    end;
...
procedure TStudent.Set_ShowNameFlag(const Value: boolean);
begin
  FShowNameFlag := Value;
end;    
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-24 13:53:45 IP:218.16.xxx.xxx 未訂閱
父代不可能預佑子代有甚麼新變數而使用的。 所以,可能的方法是 1. 既然父代要使用到 ShowNameFlag,就直接宣告在父代 2. 在子代操控的話,先查看 ShowNameFlag Ture 時才呼叫父代的 draw,父代不用再檢查 3. 使用獨立的變數,但這便不是 OO Programming 了而且很易亂。
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-28 09:51:25 IP:211.74.xxx.xxx 未訂閱
我的想法:    TSprite = class private   FStudentID: string; // student Id   FStudentName: string;   FClassName: string; // class name ... protected   ...   //宣告為虛擬抽象函式   procedure Draw(x,y:integer;Canvas: TCanvas); virtual; abstract;// 繪製角色 ... end;    TSpriteArray = array[0..TILE_NUM_Y - 1, 0..TILE_NUM_X - 1] of TSprite; // 所有學生    // Student 類別 TStudent = class(TSprite) private    ... public    ...    //Override it!    procedure Draw(x,y:integer;Canvas: TCanvas); override; end;    implementation ... procedure TStudent.Draw(x,y:integer;Canvas: TCanvas); begin    //繪出角色圖形    ...    if  ShowNameFlag  then  Canvas.textout(x,y,text);//秀出學生姓名; end;    
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-28 09:51:35 IP:211.74.xxx.xxx 未訂閱
我的想法:    TSprite = class private   FStudentID: string; // student Id   FStudentName: string;   FClassName: string; // class name ... protected   ...   //宣告為虛擬抽象函式   procedure Draw(x,y:integer;Canvas: TCanvas); virtual; abstract;// 繪製角色 ... end;    TSpriteArray = array[0..TILE_NUM_Y - 1, 0..TILE_NUM_X - 1] of TSprite; // 所有學生    // Student 類別 TStudent = class(TSprite) private    ... public    ...    //Override it!    procedure Draw(x,y:integer;Canvas: TCanvas); override; end;    implementation ... procedure TStudent.Draw(x,y:integer;Canvas: TCanvas); begin    //繪出角色圖形    ...    if  ShowNameFlag  then  Canvas.textout(x,y,text);//秀出學生姓名; end;    
系統時間:2024-05-02 9:34:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!