Discussion:
[問題] abstract 的宣告與 polymorphic 新手問題
(时间太久无法回复)
不想再留白
2007-04-23 07:50:17 UTC
Permalink
想問

如果一個class裡面想宣告abstract method
是否那個class也要宣告成abstract?
會有這樣的問題是因為書上寫
"要一次把類別裡面所有方法成為抽象方法,只要直接將類別宣告成抽象類別就可以"

但我試了 方法有abstract而包含他的class沒abstract
compiler是過不了的
而class有abstract 沒實作方法沒abstract
也是過不了

所以說沒實作方法->abstract->class也要abstract--->裡面的method都abstract了?

我感覺是有abstract method的class都要abstract
但abstract class裡有實作的method就不用宣告成abstract

是這樣嗎?

關於多型
想問甚麼時候應用? 聽說是runtime時才能決定用那一種method時才用
但還是有點搞不懂
書上的例子是
class a 為父 有method print
class b,c,d 為子 也有自己的method prind
new出四個分別為a,b,c,d的東西a1,b1,c1,d1
再宣告一個為a 的變數aref
所以 當
aref = a1;
aref.print(); 就用了a的print
aref = b1;
aref.print(); 就用了b的print
.
.
.

但這有甚麼用?
不直接用a1.print就好了?
不是很懂


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.175.116.55
骨頭
2007-04-23 17:16:33 UTC
Permalink
※ 引述《neigence (心夜)》之銘言:
: 這樣子就可以發生多型了
: 在printshape裡面 不用判斷ss是那一種子class
: 不用
: if(ss instanceof Circle)
: else if(ss instanceof Triangle)
: 程式碼可以變的容易讀 跟 擴充

多型的經典例子,
個人認為應該算是裝飾者模式和狀態模式吧。

Decorater Pattern , state pattern .
最主要的是通用型態去處理共同的問題。(?)


裝飾者就不用說了,透過包裝增加功能。
狀態模式,則是在不同的狀態對事情的處理跟著做狀態性的改變。


---
當然 , 要寫很多個if-else 不會不行,(原文說的a1.print())
不過這也是個有趣的方式~:P

--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the compiler will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
不想再留白
2007-04-23 17:43:13 UTC
Permalink
※ 引述《TonyQ (骨頭)》之銘言:
: ※ 引述《neigence (心夜)》之銘言:
: : 這樣子就可以發生多型了
: : 在printshape裡面 不用判斷ss是那一種子class
: : 不用
: : if(ss instanceof Circle)
: : else if(ss instanceof Triangle)
: : 程式碼可以變的容易讀 跟 擴充
: 多型的經典例子,
: 個人認為應該算是裝飾者模式和狀態模式吧。
: Decorater Pattern , state pattern .
: 最主要的是通用型態去處理共同的問題。(?)
: 裝飾者就不用說了,透過包裝增加功能。
: 狀態模式,則是在不同的狀態對事情的處理跟著做狀態性的改變。
: ---
: 當然 , 要寫很多個if-else 不會不行,(原文說的a1.print())
: 不過這也是個有趣的方式~:P

謝謝兩位回答

就是多一步借父class來傳object進method
裡面就發生多型去去判斷用那一個子class的method

decorater, state 這個好對我來說太進階了
我回頭再找這個的資料

java版真是太棒了
謝謝大家

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.31.14.208
骨頭
2007-04-23 18:19:37 UTC
Permalink
※ 引述《maxi326 (不想再留白)》之銘言:
: ※ 引述《TonyQ (骨頭)》之銘言:
: 謝謝兩位回答
: 就是多一步借父class來傳object進method
: 裡面就發生多型去去判斷用那一個子class的method
: decorater, state 這個好對我來說太進階了
: 我回頭再找這個的資料
: java版真是太棒了
: 謝謝大家

不見得要有method關係,
底下舉一個簡單例子來說。


當然由於懶得想的關係,所以沒設計成內部跳轉的例子,
不過你可以去找找糖果機的例子,不然鴨子也不錯。XD

大部分時候 state pattern是 自己轉換的。


我想多型的好處就是你不需要去管它是甚麼型態,
只需要就語意上去思考它會做甚麼事情。

就像是Java一樣,你不用去想跨平台怎麼實作,
只要負責寫code,剩下的交給JVM去搞就是了。XD


底下簡單的例子

人剛醒的時候,自然還是會有點想睡。
肚子餓的時候,自然會去找食物。
沒事做的時候,自然會發呆。

雖然 me 做的事情都一樣 (thinking和action),
隨著狀態的變化(多型 , 因為都是personstate),而有不同的動作。


不過這應該也不算是個好例子(我也是初學者),看看就好。XD

────────────────────────────────

class PracticeOnly {
public static void main( String[] arg ) throws Exception{

Person me=new Person();

me.setState(new wakeupstate());
me.thinking();

me.setState(new hungrystate());
me.action();

me.setState(new normalstate());
me.thinking();
me.action();

}
}

abstract class personState{
abstract void action();
abstract void thinking();
}


class Person{
personState pstate;
Person(){
pstate=new normalstate();
}
void setState(personState p){
pstate=p;
}
void action(){
pstate.action();
}

void thinking(){
pstate.thinking();
}
}

class wakeupstate extends personState{

void action(){
System.out.println("I just wake up !!");
}
void thinking(){
System.out.println("I still wanna sleep....");
}

}

class hungrystate extends personState{

void action(){
System.out.println("I need to find food...(weakly)");
}
void thinking(){
System.out.println("I am so hungry....");
}
}

class normalstate extends personState{
void action(){
System.out.println(" nothing to do ");
}
void thinking(){
System.out.println("idle....");
}
}

--
I am a person, and I am always thinking .
Thinking in love , Thinking in life ,
Thinking in why , Thinking in worth.
I can't believe any of what ,
I am just thinking then thinking ,
but worst of all , most of mine is thinking not actioning...

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68

Loading...