Avatar billede web_the_world Nybegynder
04. december 2002 - 16:55 Der er 15 kommentarer og
1 løsning

arv og overskriv

Vi har et problem angående nedarvning. Vi har nedarvet en metode der indholder et Array, men det er ikke lykkes at overskrive indholdet i arrayet i subklassen
hvordan gør man det?

vi har indsat programmet nedenfor

//*****************************************************************************************************
//  VarTekstTest.java              Forfatter: Steen og Bagger
//*****************************************************************************************************


import cs1.*;
import java.util.Random;


public class Sodo
{
    public static void main(String [] args)
    {
        NejTekster mulighed = new NejTekster();//kalder Vartekst klassen
        mulighed.randomTekst();//kalder randomTekst metoden

    }//slutter metode
}//slutter klasse

//***********************************STARTER KLASSEN VarTekst******************************************

class JaTekster
{

    public void randomTekst()
    {
        int limit=5;//arrayets længde
        int tilfaeldig;


        Random generator = new Random();//kalder Random klassen
        tilfaeldig = generator.nextInt(limit);//sætter et random tal

        String[] tekst = new String[limit];//opretter array

        for (int i = 0; i < limit; i++)
            {
            tekst[0] = "hej";
            tekst[1] = "ej";
            tekst[2] = "hj";
            tekst[3] = "he";
            tekst[4] = "h";

            }
            System.out.println("\nDen valgte brugerdialog: "+tekst[tilfaeldig]+"\n");//udskriver tilfældig sætning i arrayet

    }//slutter metode
}//slutter klasse

//************************************************************************************

class NejTekster extends JaTekster
{

    public String randomTekst2()
    {
          super.randomTekst();

            tekst[0] = "j";
            tekst[1] = "j";
            tekst[2] = "j";
            tekst[3] = "ø";
            tekst[4] = "å";

    }//slutter metode
}//slutter klasse
Avatar billede arne_v Ekspert
04. december 2002 - 16:59 #1
Jeres problem.stilling minder utroligt meget om
http://www.eksperten.dk/spm/290932 !
Avatar billede disky Nybegynder
04. december 2002 - 17:01 #2
Den randomtekst metode i kalder fra main, er jo også den som er defineret i super klassen.

Prøv at kald den som er defineret i sup klassen istedet.
Og i udskriver indholdet af tekst[] før i retter i den, så i kan ikke se ændringerne.
Avatar billede web_the_world Nybegynder
04. december 2002 - 17:06 #3
Det må jeg give dig ret i, men vores problem er noget helt andet! Vi er jo tydeligvis på et højere niveau ind stjernen...he-he - vi er jo ved at arve!
Avatar billede arne_v Ekspert
04. december 2002 - 17:08 #4
Jeg har prøvet at rette jeres kode lidt til, som jeg
*tror* I vil have det til at virke.

Her er resulatet:

import java.util.Random;

public class Sodo
{
    public static void main(String [] args)
    {
        NejTekster mulighed = new NejTekster();//kalder Vartekst klassen
        mulighed.randomTekst();//kalder randomTekst metoden
    }//slutter metode
}//slutter klasse

class JaTekster
{
    private final static int LIMIT = 5;
    protected String[] tekst = new String[LIMIT];//opretter array
    protected void initTekst()
    {
            tekst[0] = "hej";
            tekst[1] = "ej";
            tekst[2] = "hj";
            tekst[3] = "he";
            tekst[4] = "h";
    }
   
    public void randomTekst()
    {
        initTekst();
        Random generator = new Random();//kalder Random klassen
        int tilfaeldig = generator.nextInt(LIMIT);//sætter et random tal
        System.out.println("\nDen valgte brugerdialog: "+tekst[tilfaeldig]+"\n");//udskriver tilfældig sætning i arrayet
    }//slutter metode
}//slutter klasse

//************************************************************************************

class NejTekster extends JaTekster
{
    protected void initTekst()
    {
            tekst[0] = "j";
            tekst[1] = "j";
            tekst[2] = "j";
            tekst[3] = "ø";
            tekst[4] = "å";
    }//slutter metode
}//slutter klasse
Avatar billede arne_v Ekspert
04. december 2002 - 17:10 #5
Den laver den basale opgave og den bruger arv.

Jeg er dog stadigvæk ikke sikker på, at det er den
optimale måde at gøre det på.

Men jeg kender ikke jeres kontekst, så det regner jeg
med at I har styr på.
Avatar billede arne_v Ekspert
04. december 2002 - 17:10 #6
Og jeg har testet at det virker.
Avatar billede web_the_world Nybegynder
04. december 2002 - 17:13 #7
Fungere init på "samme" måde som super
Avatar billede web_the_world Nybegynder
04. december 2002 - 17:17 #8
Var vores for løkke overflødig?
Avatar billede arne_v Ekspert
04. december 2002 - 18:05 #9
Nej. Super refererer til superklassen/basisklassen/overklassen.

initTekst er en virtuel metode som bliver overridedi subklassen.
Avatar billede arne_v Ekspert
04. december 2002 - 18:06 #10
Ja. Jere for løkke var helt overflødig. I satte bare
de 5 elementer til samme værdi 5 gange.
Avatar billede web_the_world Nybegynder
04. december 2002 - 21:56 #11
Er det muligt, at du evt. kunne skrive lidt mere udførlig omkring init klassen - så jeg ved hvordan man skal bruge den en anden gang?

På forhånd tak
Avatar billede web_the_world Nybegynder
04. december 2002 - 22:01 #12
undskyld init metoden!
Avatar billede arne_v Ekspert
04. december 2002 - 22:04 #13
Det er helt almindelig teknik:
  - I har en super-klasse med en metode som gør noget
  - I har en sub-klasse med samme metode som gør noget andet

Det kunne også gøres på mange andre måder.

Men jeres oprindelige kode, som havde 2 forskellige
stykker kode der skulle udføres alt efter hvilken klasse
det var, gjorde at jeg valgte denne løsning.
Avatar billede arne_v Ekspert
04. december 2002 - 23:12 #14
Eller snakker jeg sort ?
Avatar billede web_the_world Nybegynder
05. december 2002 - 10:18 #15
Nej, det er ikke sort - og du har stort set løst vores problemstilling - vi skulle lige ændre lidt og tilføj den egentlige problemstilling, men ellers mange tak.

Mit spørgsmål går dog stadig lidt på den inetTekst() metode du bruger...
Kunne du evt. forklare lidt mere generelt om den - så jeg evt. kan benytte mig af init en anden gang...Altså hvad gør den helt præcist osv.

P.F.Tak
Avatar billede arne_v Ekspert
05. december 2002 - 10:24 #16
initTekst sætter teksterne.

JaTekster og NejTekster har hver sin, fordi de skal
sætte forskellige tekster.

Pointen er den at selvom initTekst bliver i klassen
JaTekster, så kan den godt finde ud af at bruge
NejTekster initTekst, når objektet er af typen
NejTekster.

Det er fordi alle metoder i Java per definition
er virtuelle.
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