используя ключевое слово this с расширенными классами в Java - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть класс, который называется «Предметы», на который распространяется «Equips», а затем «Helmet» расширяется от «Equips». У меня есть метод getStats, который загружает статистику элемента из файла .txt. Если я добавлю метод 'getStats' в класс 'Items', любое поле, к которому я пытаюсь получить доступ, в объекте 'Helmet', используя 'this'. появляется ноль. Поле, к которому я пытаюсь получить доступ в «Шлеме», инициализируется при создании шлема до загрузки текстового файла. Я мог бы очень легко просто поместить метод 'getStats' в класс 'Equips' и поместить пустой метод 'getStats' в класс 'Items', но мне было интересно, есть ли способ заставить его работать так, как есть. Заранее спасибо!

Items.java:

package com.projects.aoa;

import static com.projects.aoa.Print.*;

import java.util.*;
import java.io.*;

class Items {

String name, type;
int id;
int hp, mp, str, def;
boolean vacent;

static void getAllStats(Items[] e){
    for(Items i : e){
        getItemStats(i);
    }
}

static void getItemStats(Items i){
    i.getStats();
}

void getStats(){
    try {
        //System.out.println(System.getProperty("user.dir"));

        print(this.name); //THIS shows up as null as well as those \/below\/
        FileInputStream fstream = new FileInputStream(System.getProperty("user.dir") 
                + "/src/com/projects/aoa/" + this.type + this.name + ".txt");

        DataInputStream in = new DataInputStream(fstream);

        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String line;
        int counter = 0;

        while ((line = br.readLine()) != null) {
            if (line.length() == 0){
                break;
            }

            switch (counter) {
            case 0:
                this.hp = Integer.parseInt(line);
                counter++;
                break;
            case 1:
                this.mp = Integer.parseInt(line);
                counter++;
                break;
            case 2:
                this.def = Integer.parseInt(line);
                counter++;
                break;
            case 3:
                this.str = Integer.parseInt(line);
                counter++;
                break;
            }   
        }


        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

Game.java:

Helmet headBand = new Helmet("HeadBand");
Helmet bronzeHelmet = new Helmet("BronzeHelmet");


    Items[] equips = {
            headBand, bronzeHelmet
    };



    getAllStats(equips);

Equips.java:

  package com.projects.aoa;

import static com.projects.aoa.Print.print;
import static com.projects.aoa.Print.println;

import java.io.*;



class Equips extends Items{
    String name, type;
    int hp, mp, str, def;




    void printStats(){
        println("[" + name + "]");
        println("Type: " + type);
        println("HP:  " + hp);
        println("MP:  " + mp);
        println("Def: " + def);
        println("Str: " + str);
    }
}

class Helmet extends Equips {
    Helmet(String name){
        this.name = name;
        this.type = "h_";
    }
}

1 Ответ

4 голосов
/ 09 декабря 2011

Вы еще не показали нам свой класс Helmet, поэтому трудно сказать, что происходит, но мое предположение заключается в том, что вы перераспределяете поля с тем же именем в Helmet. Они будут скрывать поля в Items, тогда как вы действительно хотите использовать поля из Items.

Итак, вот короткий, но полный пример, который демонстрирует, что я думаю происходит:

class SuperClass {
    String name;

    public void setName(String newName) {
        // This writes to the field in SuperClass
        name = newName;
    }
}

class SubClass extends SuperClass {
    // This *hides* the field in SuperClass
    String name;

    public void showName() {
        // This reads the field from SubClass, which
        // nothing writes to...
        System.out.println("My name is " + name);
    }
}

public class Test {
    public static void main(String[] args) {
        SubClass x = new SubClass();
        x.setName("Test");
        x.showName();
    }
}

Я бы порекомендовал:

  • Вы делаете все поля приватными, записывая свойства для предоставления доступа к другим классам при необходимости
  • Вы избавляетесь от полей в Helmet, которые скрывают поля в Items
  • Вы изменяете имена своих классов, чтобы избежать множественности - Item и Equipment вместо Items

Вот исправленная версия вышеуказанного кода:

class SuperClass {
    private String name;

    public void setName(String newName) {
        name = newName;
    }

    public String getName() {
        return name;
    }
}

class SubClass extends SuperClass {
    public void showName() {
        System.out.println("My name is " + getName());
    }
}

public class Test {
    public static void main(String[] args) {
        SubClass x = new SubClass();
        x.setName("Test");
        x.showName();
    }
}

(Очевидно, вам также нужно подумать о том, какой доступ можно добавить к свойствам и т. Д., Но это отдельный вопрос.)

...