2014-10-08 5 views
0

저는 소프트웨어의 BSC에 약 한 달이 걸렸습니다. 우리는이 숲 프로젝트에서 다른 속도로 자라는 나무 (재와 비커)를 가지고 있습니다. 그것들은 일반 클래스 트리의 서브 클래스입니다.ArrayList에 서브 클래스 객체 추가하기

내 문제는 이제 각 종류의 트리 (애쉬 및 너도밤 나무)를 ArrayList에 추가하라는 메시지입니다. int agedouble height은 모두 달라야합니다. 나는 이것이 어떻게 설정되어야하는지에 관해서는 머리를 쓰지 않아서 조언/힌트/해결책이 크게 평가 될 수 있습니다. Ash에 대한 Tree

public class Tree{ 

public int age; 
public double height; 

public void growOneYear() 
{ 
    age++; 
} 

public void show() 
{ 
    System.out.println("Træet er " +age+ " år gammelt og " +height+ " meter højt."); 
} 
} 

소스에 대한

소스 (너도밤 나무와 거의 동일)

public class Ash extends Tree { 

public Ash() 
{ 
    age = 1; 
    height = 1.0; 
} 

public void growOneYear() 
{ 
    super.growOneYear(); 
     if(height < 15){ 
      height = height*1.20; 
     } 
} 

public void show() 
{ 
    System.out.println("Ask: "); 
    super.show(); 
} 
} 

Screenshot of the structure

+0

는 것 같은데 당신은 제네릭과 제네릭 컬렉션을 원할 것입니다. 여기를보십시오 : cs.nyu.edu/courses/spring12/CSCI-GA.3033-014/generics-tutorial.pdf –

답변

1

당신은 이미 당신이 ListTree의의 모든 나무와 Tree의의 서브 클래스를 저장하기 위해 할 필요가 기본적으로 만드는 것입니다이 시점에서, 클래스 선언에 extends TreeTree를 서브 클래스하고 고려 목록을 만들고 목록에 트리를 추가하십시오.

public class Forest 
{ 
    private List<Tree> trees; 

    public Forest() 
    { 
     trees = new ArrayList<>(); //diamond syntax Java 7, ArrayList<Tree>() on Java 6 
    } 

    public void addTree(Tree tree) 
    { 
     trees.add(tree); 
    } 

    public void growTreesByOneYear() 
    { 
     for(Tree tree : trees) 
     { 
      tree.growOneYear(); 
     } 

     //you can do trees.stream().forEach(x -> x.growOneYear()); on Java 8 
    } 

    public void showTrees() 
    { 
     for(Tree tree : trees) 
     { 
      tree.show(); 
     } 
    } 
} 

public class MainClass 
{ 
    public static void main(String[] args) 
    { 
     Forest forest = new Forest(); 
     Ash ashTree = new Ash(); 
     Beech beechTree = new Beech(); 
     forest.addTree(ashTree); 
     forest.addTree(beechTree); 
     forest.show(); 
     forest.growTreesByOneYear(); 
     forest.show(); 
    } 
} 

도움이 되길 바랍니다.

아, 그리고 나무를 위해 - 당신은 아마 생성자 매개 변수의 나이와 높이를 제공하고, 그들에게 같은 것을 만들 수 있습니다

Ash ash = new Ash(5, 1.5); //age, height 

public class Ash extends Tree 
{ 
    public Ash(int age, double height) 
    { 
     this.age = age; 
     this.height = height; 
    } 
} 

또는에를 사용합니다 솔직히 말해서 다음과 같이 더 명확합니다.

public class Tree 
{ 
    public Tree(int age, double height) 
    { 
     this.age = age; 
     this.height = height; 
    } 
} 

public class Ash extends Tree 
{ 
    public Ash(int age, double height) 
    { 
     super(age, height); 
    } 
} 
+1

정말 고마워요!내일 다시 돌아올 것이고 어떤 후속 질문에 비틀 거려야하는지 알 겠지만 그것은 완벽하게 이해할 수 있습니다. 다시 한 번 감사드립니다. – Aphex

1

사용 상속.

선언 Ash하고 trees 컬렉션에 Tree 개체를 추가 할 수 있도록해야한다 Tree 클래스를 사용하여 Beech 객체.

Tree ash = new Ash(); 
Tree beech = new Beech(); 
ash.growOneYear(); 
beech.growOneYear(); 
trees.add(ash); 
trees.add(beech); 
0

설명을 위해 몇 가지 코드를 사용합니다. 의견에서이 문맥에서 이해해야하는 "키워드"는 대문자로되어 있습니다.

내 클래스는 PACKAGE 액세스 한정자 (실제로는 쓰여지지 않고 다른 액세스 한정자는 PUBLIC, PROTECTED & PRIVATE)입니다. 하나의 소스 파일에 여러 클래스를 가질 수 있기 때문입니다.

이 정보가 도움이 되었기를 바랍니다. 제가 도울 수 있다면, 주저하지 말고 물어보십시오.


import java.util.ArrayList; 


class Forest { 

    public ArrayList<Tree> trees = new ArrayList(); 

    public void initialize() { 
     // create and add 3 ashes on 3 different ways 
     Ash ash1 = new Ash(10,32.5);  
     Tree ash2 = new Ash(1,2.5); 
     this.trees.add(ash1);  // "this" references the current object, but 
     trees.add(ash2);   // as there is no local trees variable 
     trees.add(new Ash(3,12.0)); // defined the compilier picks the right one 
     trees.add(new Tree(1,1.0)); 
    } 

    public static void main(String[] args) { 
     Forest forest = new Forest(); 
     forest.initialize(); 
     for (Tree tree : forest.trees) { // FOR EACH loop 
      System.out.println(tree.getClass()+" Age: "+tree.age); 
     } 
    }    
} 


class Tree { 
    public int age; 
    public double height; 
    public Tree(int age,double height) { // CONSTRUCTOR - creates an the object 
     this.age=age;   // "this" references the current object, so in 
     this.height=height;  // this case the MEMBER VARIABLE is assigned 
    }       // the PARAMETER value 
} 


class Ash extends Tree { 
    public Ash(int age,double height) { 
     super(age,height);  // calls the constructor of the SUPERCLASS (Tree 
    }       // in this case with the PARAMETERs 
} 
관련 문제