作者wtchen (沒有存在感的人)
看板java
標題[問題] 繼承與多型的新手問題
時間Wed Jan 22 18:18:40 2014
最近在自學data structure的分數運算(真的是自學,非作業)
我c++已有很久經驗,可是到了java(剛開始碰)很多轉不過來,
(應版主要求把程式貼全,並重新發問)
class Rational
{
protected long numerator;
protected long denominator;
public Rational()
{
// assume the rational number is 0
numerator = 0;
denominator = 1;
}
public Rational(long i)
{
numerator = i;
denominator = 1;
}
public Rational(long num,long denom)
{
numerator = num;
denominator = denom;
}
public void setRational(long i,long j)
{
numerator = i;
denominator = j;
}
public void print()
{
System.out.println("Rational is :" + numerator + "/" + denominator);
}
public void error(String message)
{
System.out.println(message);
}
public void reduce()
{
long a, b, rem, sign;
sign = 1;
if ( numerator == 0 )
{
denominator = 1;
}else if ( numerator == denominator )
{
denominator = 1;
numerator = 1;
}else if ( numerator < 0 && denominator < 0 )
{
numerator = -numerator;
denominator = -denominator;
}else if ( numerator < 0 )
{
numerator = -numerator;
sign = -1;
}else if ( denominator < 0)
{
denominator = -denominator;
sign = -1;
}
if (numerator>denominator)
{
a = numerator;
b = denominator;
}else
{
a = denominator;
b = numerator;
}
while (b != 0)
{
rem = a%b ;
a = b ;
b = rem ;
}
numerator = sign * numerator / a ;
denominator = denominator / a ;
}
public Rational add(Rational r)
{
long k, denom, num;
Rational rnl = new Rational() ;
reduce();
r.reduce();
rnl.setRational(denominator, r.denominator);
rnl.reduce();
k = rnl.denominator;
denom = denominator * k;
num = numerator * k + r.numerator*denom/k;
rnl.setRational(num, denom);
rnl.reduce();
return rnl;
}
public Rational add(long i)
{
Rational r = new Rational() ;
r.setRational(i,1);
return add(r);
}
public Rational sub(Rational r)
{
long k, denom, num;
Rational rnl = new Rational() ;
reduce();
r.reduce();
rnl.setRational(denominator, r.denominator);
rnl.reduce();
k = rnl.denominator;
denom = denominator * k;
num = numerator * k - r.numerator*denom/k;
rnl.setRational(num, denom);
rnl.reduce();
return rnl;
}
public Rational mult(Rational r)
{
reduce();
r.reduce();
Rational rnl1 = new Rational(numerator, r.denominator);
Rational rnl2 = new Rational(r.numerator, denominator);
Rational rnl3 = new Rational();
rnl1.reduce();
rnl2.reduce();
rnl3.setRational(rnl1.numerator*rnl2.numerator,
rnl1.denominator*rnl2.denominator);
return rnl3;
}
public Rational divide(Rational r)
{
reduce();
r.reduce();
Rational rnl = new Rational(r.denominator, r.numerator);
return mult(rnl);
}
public int equal(Rational r)
{
reduce();
r.reduce();
if (numerator == r.numerator && denominator == r.denominator)
{
return 1;
}else
{
return 0;
}
}
}
class Rational2 extends Rational
//這邊是想用Rational2繼承Rational後增加一個setRational
{
public void setRational(long num)
{
numerator = num;
denominator = 1;
}
public Rational2() //純粹繼承
{
super();
}
public Rational2(long i)
{
super(i);
}
public Rational2(long num,long denom)
{
super(num, denom);
}
public Rational2 divide(Rational2 r) //這邊會出問題,不寫一樣不能編譯
{
super(r);
}
}
public class Integer
{
public static void main(String []args)
{
Rational2 a = new Rational2() ;
a.setRational(18,69);
Rational2 b = new Rational2(22,8);
// Rational2 c = a.divide(b) ;
b.print( );
System.out.println(a.equal(b));
System.out.println(System.getProperty("os.arch"));
// c.error("test");
}
}
編譯錯誤訊息:
Integer.java:211: error: incompatible types
Rational2 c = a.divide(b) ;
^
required: Rational2
found: Rational
1 error
請問這種情況下要怎麼改才對?
我只是在練習c++/java之間的對換,謝謝
當 Rational2 繼承 Rational以後
原來的Rational divide(Rational)要怎麼讓Rational2也能使用?
(就是Rational2 divide(Rational2) 跟 Rational2 divide(Rational)都能用?)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 86.200.55.194
推 haha02:單就這個編譯錯誤: public Rational2 divide(Rational r) 01/22 18:27
→ haha02:算了當我沒說好了 剛剛沒仔細看 癥結點貌似不在這邊 01/22 18:29
→ wtchen:爬文爬很久沒找到該怎麼做 01/22 18:30
推 haha02:單就這邊貼出來的程式碼其實還有兩三個問題會發生 01/22 18:33
→ wtchen:當Class ABC裏面有 ABC xxx(ABC yyy)的時候要怎麼做繼承 01/22 18:33
※ 編輯: wtchen 來自: 86.200.55.194 (01/22 18:34)
推 haha02:直接會繼承啊不用特別寫 看起來你是想做override? 01/22 18:51
→ wtchen:我是想搞清楚繼承的概念 01/22 20:03
→ wtchen:class Rational2 extends Rational 後在Rational2增加一個 01/22 20:06
※ 編輯: wtchen 來自: 86.200.55.194 (01/22 20:13)
※ 編輯: wtchen 來自: 86.200.55.194 (01/22 20:15)
推 haha02:用 Rational [變數] = new Rational2() 就可以了吧? 01/22 20:22
推 haha02:另外java不允許arg與名稱一樣但是回傳值不一樣的method共存 01/22 20:31
→ wtchen:原來是這樣,感謝說明。 01/22 20:34
推 psliurt:C++也有繼承觀念阿,還有所謂的virtual table的樣子 02/02 15:55