2015-10-15 2 views
1

Почему переменные basica (Crank) и basicb (Pedal) не отображаются на моем дисплее arraylist вместе с другими значениями? Есть еще один класс под названием Part, который я могу опубликовать, если это необходимо, но он просто игнорирует эти переменные.Проблема с методом toString

Главный класс

package main; 

    import java.util.ArrayList; 
    import java.util.List; 
    import java.util.Scanner; 

public class TestAssembledPart { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    Scanner sc = new Scanner(System.in); 
    List<AssembledPart> aparts = new ArrayList<AssembledPart>(); 
    aparts.add(new AssembledPart("a200", "Crank & Pedal", 10, 3.5, "Crank", "Pedal")); 

    System.out.println("part before stock level change - start"); 
    System.out.println(AssembledPart.toAssembledString(aparts)); 

} 

} 

AssembledPart класс

package main; 
import java.util.*; 

public class AssembledPart extends Part { 

private String basica; 
private String basicb; 

public AssembledPart(String id, String name, int stocklevel, double unitprice, 
        String basica, String basicb) { 

    super(id, name, stocklevel, unitprice); 

    this.basica = basica; 
    this.basicb = basicb; 
} 


public String toAssembledString(String id, String name, int stocklevel, double unitprice) { 
    return id + " | " + name + " | " + stocklevel + " | " + unitprice + " | " + basica + " | " + basicb; 
} 

public static String toAssembledString(Collection<AssembledPart> aparts){ 
    String s = ""; 
    for (AssembledPart apart: aparts){ 
     s += apart + "\n"; 
    } 
    return s; 
} 
} 

Часть Класс

package main; 
    import java.util.*; 

    public class Part { 

private String id; 
private String name; 
private int stocklevel; 
private double unitprice; 

private int qty = 6000; 

public Part(String id, String name, int stocklevel, double unitprice){ 
    this.id = id; 
    this.name = name; 
    this.stocklevel = stocklevel; 
    this.unitprice = unitprice; 
} 


String partsAvailable() 
{ 
    //String newLine = System.getProperty("line.separator"); 
    return (id + "\t" + name + "\t " + stocklevel + "\t\t " + unitprice); 
} 


public String getID() { 
    return id; 
} 

public void setID(String id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getStockLevel(){ 
    return stocklevel - qty; 
} 

public void setStockLevel(int stocklevel){ 
    this.stocklevel = stocklevel; 
} 

public double getUnitPrice(){ 
    return unitprice; 
} 

public void setUnitPrice(double unitprice){ 
    this.unitprice = unitprice; 
} 

public void replenish(int qty){ 
    this.stocklevel = stocklevel + qty; 
} 

public double supply(int qty){ 
    return unitprice * qty; 
} 

public String toString() { 
    return id + " | " + name + " | " + stocklevel + " | " + unitprice; 
} 


public static String toString(Collection<Part> parts){ 
    String s = ""; 
    for (Part part: parts){ 
     s += part + "\n"; 
    } 
    return s; 
} 

}

output

+2

вы могли бы поделиться своим класс 'Part', кажется, как если бы вы сделали переопределить' toString' в вашем классе 'Part', но didn't сделать это в вашем классе' AssembledPart'. – SomeJavaGuy

ответ

3

Поскольку вы не вызываете методAssembledString(), вы вызываете метод toString(), который (я ожидаю) реализован в классе Part.

Вместо этого:

for (AssembledPart apart: aparts){ 
    s += apart + "\n"; 

ли это:

for (AssembledPart apart: aparts){ 
    s += apart.toAssembledString() + "\n"; 

Затем следует избегать параметров в методы экземпляра:

public String toAssembledString(String id, String name, int stocklevel, double unitprice) { 
    return id + " | " + name + " | " + stocklevel + " | " + unitprice + " | " + basica + " | " + basicb; 
} 

Делают это следующим образом:

public String toAssembledString() { 
    return super.toString() + " | " + basica + " | " + basicb; 
} 

Спасибо @Parker_Halo за комментарий

+2

Метод toAssembledString (...) имеет некоторые параметры, которые затрудняют ваш ответ –

+1

ohhhh ok cool, спасибо. его мой первый раз работающий с наследованием – danielb

+0

его рассказывающий apart.toAssembledString() нужен параметр – danielb

0

Поскольку вы назначаете пустое значение в строку в методе 'toAssembledString';

String s = ""; 

бы вы ни делали, это всегда будет возвращать 1 комбинацию, так как вы делаете s="";

Объявить его в качестве переменной класса и просто добавив его к старой.

Пользователь StringBuilder, здесь лучше.

Кроме того, создайте метод, который будет выполнять s=""; в случае, если вам необходимо очистить данные строки, чтобы вы могли повторно использовать эту статическую строку для другого объекта, иначе она добавит данные в старый.

1

Это потому, что он вызывает Part.toString(), а часть не имеет переменных basica и basicb. Перед печатью вы должны позвонить toAssembledString() вместо простых деталей.

0

Вы можете переопределить toString() вместо того, чтобы писать свои собственные перегружен toAssembledString(String id, String name, int stocklevel, double unitprice), если вы не хотите, чтобы изменить реализацию toAssembledString(Collection<AssembledPart> aparts) '

public String toString() { 
    return id + " | " + name + " | " + stocklevel + " | " + unitprice + " | " + basica + " | " + basicb; 
} 
+0

id и имя, похоже, личное ... –

+0

Сообщение было отредактировано после моего ответа, мы можем использовать соответствующие геттеры вместо полей непосредственно. –

+0

вызов 'super.toString' должен быть более простым способом получения значений. – SomeJavaGuy

0

Кажется, как будто ваша часть класса будет искать что-то вроде этого

public class Part { 
    String a, b; 
    int c; 
    double d; 

    public Part(String a, String b, int c, double d) { 
     this.a = a; 
     this.b = b; 
     this.c = c; 
     this.d = d; 
    } 

    @Override 
    public String toString() { 
     StringJoiner j = new StringJoiner(" | "); 
     j.add(a); 
     j.add(b); 
     j.add(Integer.toString(c)); 
     j.add(Double.toString(d)); 
     return j.toString(); 
    } 
} 

по телефону s += apart + "\n"; Вы автоматически вызываете метод toString своего класса, который выглядит как переоцененный классом Part , для получения желаемого результата для вашего класса AssembledPart вы должны переопределить метод toString и добавить дополнительную информацию, подобную этой.

@Override 
public String toString() { 
    StringJoiner j = new StringJoiner(" | "); 
    j.add(super.toString()); 
    j.add(basica); 
    j.add(basicb); 
    return j.toString(); 
} 
Смежные вопросы