作者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
1F:推 haha02:单就这个编译错误: public Rational2 divide(Rational r) 01/22 18:27
2F:→ haha02:算了当我没说好了 刚刚没仔细看 症结点貌似不在这边 01/22 18:29
3F:→ wtchen:爬文爬很久没找到该怎麽做 01/22 18:30
4F:推 haha02:单就这边贴出来的程式码其实还有两三个问题会发生 01/22 18:33
5F:→ wtchen:当Class ABC里面有 ABC xxx(ABC yyy)的时候要怎麽做继承 01/22 18:33
※ 编辑: wtchen 来自: 86.200.55.194 (01/22 18:34)
6F:推 haha02:直接会继承啊不用特别写 看起来你是想做override? 01/22 18:51
7F:→ wtchen:我是想搞清楚继承的概念 01/22 20:03
8F:→ 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)
9F:推 haha02:用 Rational [变数] = new Rational2() 就可以了吧? 01/22 20:22
10F:推 haha02:另外java不允许arg与名称一样但是回传值不一样的method共存 01/22 20:31
11F:→ wtchen:原来是这样,感谢说明。 01/22 20:34
12F:推 psliurt:C++也有继承观念阿,还有所谓的virtual table的样子 02/02 15:55