Avatar billede theboy Nybegynder
02. august 2003 - 20:12 Der er 21 kommentarer og
1 løsning

Bruge en metode på en klasse til en anden klasse til en anden

Jeg har et program der ser sådan ud:
en klasse (person), der indeholder variablen (klassen Karaterblad) indde i klassen Katakterblad er der en funktion:
tilføjKarakter(Karakter k);
hvor Karakter er et ny klasse jeg har oprettet

Når jeg så har en person n, med et karakterblad kb, der skal tilføjes en karakter k
Hvordan gøres dette så?
Jeg har forsøgt mig med:

        Person n = new Person();
        System.out.println("2: "+klasseliste.get(2));
        n = (Person) klasseliste.get(2);
        Karakter k = new Karakter6();
        k.setKarakter("IT",10,"August","Klaus");
        n.Karakterblad.tilføjKarakter(k);
men man kan vist ikke sige:
        n.Karakterblad.tilføjKarakter(k);
Så hvad gør jeg så?
Avatar billede theboy Nybegynder
02. august 2003 - 20:14 #1
Der kom vist lige et 6 tal for meget ind!
        Person n = new Person();
        System.out.println("2: "+klasseliste.get(2));
        n = (Person) klasseliste.get(2);
        Karakter k = new Karakter();
        k.setKarakter("IT",10,"August","Klaus");
        n.Karakterblad.tilføjKarakter(k);
Avatar billede riversen Nybegynder
02. august 2003 - 20:16 #2
kan du ikke bare lige smide hele koden
Avatar billede riversen Nybegynder
02. august 2003 - 20:18 #3
men der er flere måde du kan gøre det på.

Du kan lave en getmetode i person der returnerer karakterbladet og så tilføje derefter, du kan lave karakterblad public, protected eller "package scope" afhængig af forskellige ting, eller du kan lave en metode i person der sender dataene videre til karakterbladet
Avatar billede theboy Nybegynder
02. august 2003 - 20:20 #4
import java.util.*;
public class klasse
{
    public static void main (String args[])
    {
        ArrayList klasseliste = new ArrayList();
        for (int n=0 ; n<5 ; n++)
        {
            Person personen = new Person();
            personen.setpostnummer(n);
            klasseliste.add(personen);
        }
        Person n = new Person();
        System.out.println("2: "+klasseliste.get(2));
        n = (Person) klasseliste.get(2);
        Karakter k = new Karakter();
        k.setKarakter("IT",10,"August","Klaus");
        n.Karakterblad.tilføjKarakter(k);
    }
}
------
import java.util.*;
public class Karakterblad
{
    ArrayList karaktere = new ArrayList();
    public void tilføjKarakter(Karakter k)
    {
    karaktere.add(k);
    }
}   
-----
public class Karakter
{
    String fag;
    int karakteren;
    String dato;
    String lærer;
   
    public void setKarakter(String f, int k, String d, String l)
    {
        fag = f;
        k = karakteren;
        d = dato;
        l = lærer;
    }
}
--------
Avatar billede riversen Nybegynder
02. august 2003 - 20:22 #5
er det bare mig eller mangler Person-klassen?
Avatar billede theboy Nybegynder
02. august 2003 - 20:23 #6
Jo, jeg troede bare ikke den var så vigtigt, men her er den:


public class Person
{
    String navn;
    String adresse;
    int postnummer;
    String by;
    Karakterblad kaBlad;
   
    public void setpostnummer(int n)
    {
        postnummer = n;
    }
   
    public String toString()
    {
        return ("Navn:"+ navn+"\nAdresse: "+adresse+"\nPostnummer: "+postnummer+"\nBy: "+by+"\nKaratere: "+kaBlad);
    }

}
Avatar billede riversen Nybegynder
02. august 2003 - 20:23 #7
er der en speciel grund til du bliver nødt til at caste klasseliste.get(2)?
Avatar billede riversen Nybegynder
02. august 2003 - 20:24 #8
du burde kunne sige person.kaBlad.tilføjKarakter( foo )
Avatar billede riversen Nybegynder
02. august 2003 - 20:25 #9
og set postnummer metoden kan fjernes, hvis klasserne ligger i samme pakke. Du bør overveje at isolere din datakerne og lave de nødvendige set/get metoder
Avatar billede riversen Nybegynder
02. august 2003 - 20:26 #10
dvs. n.kaBlad.tilføjKarakter( foo );
Avatar billede theboy Nybegynder
02. august 2003 - 20:26 #11
okay, men det var bare for at have en "person" at kunne prøve det af på.
Avatar billede riversen Nybegynder
02. august 2003 - 20:27 #12
det gælder også dine andre klasser mht. indkapslingen...ikke kun person
Avatar billede theboy Nybegynder
02. august 2003 - 20:54 #13
Det lykkedes ja.
Ved at indsætte
    public void setKarakterblad(Karakter k)
    {
        kaBlad.tilføjKarakter(k);
    }
i person klassen
Avatar billede riversen Nybegynder
02. august 2003 - 20:56 #14
nemlig...
Avatar billede riversen Nybegynder
02. august 2003 - 20:56 #15
så kan du med fordel lave kaBlad private
Avatar billede theboy Nybegynder
02. august 2003 - 21:03 #16
For at få den ovenstående til at virke var jeg nød til at lave om i starten af Person klassen:
Således at
    Karakterblad kaBlad
    om til:
    Karakterblad kaBlad = new Karakterblad();
ellers fik jeg en Null point exception ved runtime.
og jeg kan vist ikke lave den om til en
    Private Karakterblad kaBlad = new Karakterblad();
??
Avatar billede riversen Nybegynder
02. august 2003 - 21:06 #17
ved du hvad en constructor er?
Avatar billede theboy Nybegynder
02. august 2003 - 21:07 #18
Jo det vist den man kan bruge når man skal initialisere en klasse fra start af med nogle variabler
Avatar billede riversen Nybegynder
02. august 2003 - 21:08 #19
yes, sådan en kan du måske med fordel lave i karakter. Så er du fri for kaldet af setkarakter
Avatar billede riversen Nybegynder
02. august 2003 - 21:11 #20
men har du ellers får svar på det du ville?
Avatar billede theboy Nybegynder
02. august 2003 - 21:15 #21
ja
Avatar billede arne_v Ekspert
02. august 2003 - 21:35 #22
Et eksempel til lidt inspiration:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Student smartguy = new Student("Sam Smart", "Matematikvej 12345", 9999, "Universitetsbyen");
        smartguy.addGrade(new Grade("Dansk", "Børge Grammaticus", new Date(), 10));
        smartguy.addGrade(new Grade("Regning", "Ole Tal", new Date(), 11));
        System.out.println(smartguy);
        Grade[] grades = smartguy.getAllGrades();
        for(int i = 0; i < grades.length; i++) {
            System.out.println(grades[i]);
        }
    }
}

class Student {
    private String name;
    private String address;
    private int zip;
    private String city;
    private GradeSheet grades;
    public Student(String name, String address, int zip, String city) {
        this.name = name;
        this.address = address;
        this.zip = zip;
        this.city = city;
        grades = new GradeSheet();
    }
    public void move(String address, int zip, String city) {
        this.address = address;
        this.zip = zip;
        this.city = city;
    }
    public String toString() {
        return name + "," + address + "," + zip + " " + city;
    }
    public void addGrade(Grade grade) {
        grades.add(grade);
    }
    public Grade[] getAllGrades() {
        return grades.toArray();
    }
}

class GradeSheet {
    private List list;
    public GradeSheet() {
        list = new ArrayList();
    }
    public void add(Grade grade) {
        list.add(grade);
    }
    public Grade[] toArray() {
        int n = list.size();
        Grade[] res = new Grade[n];
        for(int i = 0; i < n; i++) {
            res[i] = (Grade)list.get(i);
        }
        return res;
    }
}

class Grade {
    private String course;
    private String teacher;
    private Date date;
    private int grade;
    public Grade(String course, String teacher, Date date, int grade) {
        this.course = course;
        this.teacher = teacher;
        this.date = date;
        this.grade = grade;   
    }
    public String toString() {
        return "[" + course + "," + teacher + "," + date + "," + grade + "]";
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester