2011-02-13 77 views
1
public abstract class Figure 
{ 
    private int offset; 

    public Figure() 
    { 
    offset = 0; 
    } 

    public Figure(int theOffset) 
    { 
    offset = theOffset; 
    } 

    public void setOffset(int newOffset) 
    { 
    offset = newOffset; 
    } 

    public int getOffset() 
    { 
    return offset; 
    } 

    public abstract void drawHere(); 

    /** 
    * Draws the figure at lineNumber lines down from the 
    * current line. 
    */ 

    public void drawAt(int lineNumber) 
    { 
    int count; 
    for(count = 0; count < lineNumber; count++) 
     System.out.println(); 
    drawHere(); 
    } 
} 

在这个类中,它处理创建树的图。我试图通过简单地给抽象方法给一个实体来把它变成一个普通的类。我注意到,当我删除抽象标签时,它仍然正常工作。但是我的问题是,如果我想让班级变得非抽象,我会通过什么方式来做到这一点?Java - 抽象类到普通类

这个类被另外两个类扩展,然后它有主类。我是否也必须通过并修改它们?

+0

图上扩展的两个类是Box和Triangle,它们不是抽象的。唯一抽象的类是图。我会用一个方法来绘制这个图来代替'public abstract void drawHere();'完成摘要的删除?这是为了强调抽象标签的易用性。 – Mike 2011-02-13 23:22:58

回答

0

如果你想要一个非抽象类,那么你不能用abstract修饰符声明它(即只是public class Figure)。不应该有任何需要修改任何派生类(只要它们本身不是抽象的)。

2

你不应该改变图;你应该扩展它。

该类由2其他 类后延伸,并且然后它具有主 类。我是否必须经过并修改这些? ?

所有更多的理由不改变图:你会打破其余的代码。

你不应该修改任何东西。创建一个扩展图的新类,并用你想要的行为重写抽象drawHere()方法。

0

从技术上讲,为了使一个抽象类,非抽象的,你必须:

  • 所有抽象方法的实现
  • 既然你现在所拥有的一切的有效实施定义,删除所有抽象标签

没有必要修改继承类中的任何东西(假设它们是非抽象的),因为它们已经提供了其父的所有抽象方法的实现可以自由覆盖他们希望的任何方法。

你是否应该让你的班级不抽象是另一个讨论点。

0

删除abstract关键字并实现抽象方法使得该类非抽象是正确的。

但是,您通常不希望将类本身从抽象转换为非抽象。除非添加此关键字,否则类不是抽象的,所以您(或其他人)显然有理由确定它不是普通类,而是抽象类。

如果您在非常高的层次上(远离Java)思考它,那么您就会知道如何绘制“树”。同样,你可以想象一个子类“圈子”,你知道什么样的图画看起来像。然而,对于非常通用的“图”,你不知道它的意思。

这就是为什么实际的绘制在你Figure类离开abstract的想法。因此,你不应该让Figure非抽象的,而是通过实现Figure中的所有抽象方法来关注从它延伸出来的类并使这些非抽象类。在您的Tree课程中,您知道drawHere应该做什么,因此在此处执行以打印树。在另一个班级中,例如Circle,您的实施方式有所不同,但在Figure中执行此操作永远不会有意义,因为您不知道要绘制什么内容。

0

你可以声明的方法体drawHere()(大概是空的,因为,正如@Frank指出的那样,你不能真正有关于如何绘制Figure任何想法),然后卸下abstract修饰。然后你会有一个具体的课程。这意味着有人可以创建一个new Figure()。这不是你现在拥有的两个子类中的任何一个,只是一个Figure

如果这样一个对象(当它被调用到drawHere()时什么也不会)没有用(特别是,如果你认为有这样一个对象是错误的),那么你应该保持类抽象。即使您可以为每种方法定义实现,此推理仍然适用。

2

当你有一个抽象类,

abstract class AbstractCar { 

    float maxSpeed; 
    Driver whoIsDriving; 

    AbstractCar(float ms, Driver d) { 
     maxSpeed = ms; 
     if(!validateDriver(d)) throw new InvalidDriverException(); 
     whoIsDriving = d; 
    } 

    abstract boolean validateDriver(Driver d); 

} 

您可以通过扩展和界定问题的抽象方法分别定义了各种条件下的行为。

class CrappyCar extends AbstractCar {  
    boolean validateDriver(Driver d) { 
     return d.hasLicense() && d.hasInsurance(); 
    } 
} 

class ExpensiveCar extends AbstractCar { 
    boolean validateDriver(Driver d) { 
     return d.hasLicense() && d.hasInsurance() && d.hasGoodJobInCaseHeMessesUpMyCar(); 
    } 
} 
0

如果一个类是由抽象的,你可以给身体所有methodes或没有这些,但如果任何类扩展抽象类,它必须实现所有这些只被宣布梅索德。