[問題] 繼承與多型的新手問題(已修改問題)
最近在自學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
推
01/22 18:27, , 1F
01/22 18:27, 1F
→
01/22 18:29, , 2F
01/22 18:29, 2F
→
01/22 18:30, , 3F
01/22 18:30, 3F
推
01/22 18:33, , 4F
01/22 18:33, 4F
→
01/22 18:33, , 5F
01/22 18:33, 5F
※ 編輯: wtchen 來自: 86.200.55.194 (01/22 18:34)
推
01/22 18:51, , 6F
01/22 18:51, 6F
→
01/22 20:03, , 7F
01/22 20:03, 7F
→
01/22 20:06, , 8F
01/22 20:06, 8F
※ 編輯: wtchen 來自: 86.200.55.194 (01/22 20:13)
※ 編輯: wtchen 來自: 86.200.55.194 (01/22 20:15)
推
01/22 20:22, , 9F
01/22 20:22, 9F
推
01/22 20:31, , 10F
01/22 20:31, 10F
→
01/22 20:34, , 11F
01/22 20:34, 11F
推
02/02 15:55, , 12F
02/02 15:55, 12F
java 近期熱門文章
PTT數位生活區 即時熱門文章