Avatar billede nanders Nybegynder
18. september 2003 - 14:54 Der er 30 kommentarer og
1 løsning

(Cast) i return statements.

Kære eksperter,

I nedenstående program ønsker jeg, i metoden leadsTo(,) at returnere hvilket rum der er tale om. Når jeg gør det som jeg gør får jeg et objekt ud i stedet.
 
import java.util.*;

/**
* Room...
*
* @author  Michael E. Caspersen
* @version 26 March 2003
*/
public class Room {

    private List rooms;
    private Collection items;
    private String name;

    /**
    * rooms is a list of length 4 where
    *  rooms.get(0) refers to the room in direction EAST
    *  rooms.get(1) refers to the room in direction NORTH
    *  rooms.get(2) refers to the room in direction WEST
    *  rooms.get(3) refers to the room in direction SOUTH
    *
    * items is a collection with references to the items in the room
    *
    * name is the name of the room (useful for testing)
    */

    public Room(String name) {
        rooms = new ArrayList(4);
        for (int i = 0; i<4; i++) {
            rooms.add(i, null);
        }
        items = new ArrayList();
        this.name = name;
    }

    /**
    * Connects the room to room <code>r</code> in direction <code>dir</code>
    */
    public void connectTo(int dir, Room r) {
        rooms.set(dir, r);
    }

    /**
    * Returns whether there is a room in direction <code>dir</code> from this room
    */
    public boolean roomExists(int dir) {
       
        if (rooms.get(dir)!=null)
            {
                return true;
                }
            else
            {
                return false;
                } 
    }

    /**
    * Returns the room connected to this room in direction <code>dir</code>
    */
   
public Room leadsTo(int dir) {
       
        Room a = "I retning " + dir + " er rummet" + (String)rooms.get(dir);
        return a;
        }

    /**
    * Adds item <code>i</code> to the room
    */
    public void addItem(Item i) {
        items.add(this);
    }

    /**
    * Return whether there are any items in this room
    */
    public boolean itemExists() {
       
        if (items.size()>0) {
            return true;
            }
            else {
                return false;
                }
    }
    /**
    * Return an Item chosen randomly among all items in the room
    */
    public Item chooseItem() {
       
        return null; // kun indsat for at tilfredsstille oversætteren
    }

    /**
    * Removes item <code>i</code> from the room
    */
    public void removeItem(Item i) {
        items.remove(this);
    }

}

mvh

nanders
Avatar billede arne_v Ekspert
18. september 2003 - 15:03 #1
public String leadsTo(int dir) {
    return ("I retning " + dir + " er rummet" + (String)rooms.get(dir));
}

måske ?
Avatar billede nanders Nybegynder
18. september 2003 - 15:10 #2
Hej Arne,

Den skal hedde     public Room leadsTo(int dir)

/ nanders
Avatar billede nanders Nybegynder
18. september 2003 - 15:13 #3
I øvrigt siger den,

ClassCastException
null

på ovenstående når den eksekveres. For compileren er den OK.
Avatar billede conrad Nybegynder
18. september 2003 - 15:16 #4
Arne>> Holder din cast (jeg har - adgang til java lige nu)? Og i så fald, hvorfor skal det ikke være:

public String leadsTo(int dir) {
    return ("I retning " + dir + " er rummet" + ((Room)rooms.get(dir)).name );
}
Avatar billede conrad Nybegynder
18. september 2003 - 15:18 #5
Så skal du have denne
public Room leadsTo(int dir) {
       
       
        return (Room)rooms.get(dir);
        }
Avatar billede jakoba Nybegynder
18. september 2003 - 15:19 #6
Så kommer du til at 'returnere din streng på en anden måde.
fx:
public class Room {

    private List rooms;
    private Collection items;
    private String name;
    public String roomMsg = "";    // tilføjet en message variabel

...
public Room leadsTo(int dir) {  // finkton ændret
     
        Room a = rooms.get(dir);
        a.roomMsg = "I retning " + dir + " er rummet" + (String)a;
        return a;
        }

og der hvor du kalder leadTo må du så selv hente teksten frem

  Room dinVar = leadsTo( retning );
  System.out.println( dinvar.roomMsg );

mvh JakobA
Avatar billede nanders Nybegynder
18. september 2003 - 15:19 #7
Hej Arne,

Når jeg prøver at teste hele moletjavsen med:

import java.util.*;

public class Driver
{
    private Room Køkken;
    private Room Stue;

public void test()
    {
        Room køkken = new Room("Køkken");
        Room stue = new Room("Stue");
        køkken.connectTo(1,Stue);
        køkken.leadsTo(1);
        }
   
    }

går det ligeledes i ged.

/ nanders
Avatar billede jakoba Nybegynder
18. september 2003 - 15:22 #8
Ps: du kan ikke bare caste et room objekt til en streng. du må lave en toString metode som fx:

  public String toString() {
      return this.name;
  }
Avatar billede arne_v Ekspert
18. september 2003 - 15:23 #9
Hvis du vil returenere et Room objekt så er Conrads kod ekorrekt.

Hvis du vil returnere en String så skal du bruge min (bare med den String cast fjernet):

public String leadsTo(int dir) {
    return ("I retning " + dir + " er rummet" + rooms.get(dir));
}

Hvis altså Room har en toString metode.
Avatar billede arne_v Ekspert
18. september 2003 - 15:24 #10
Hvis der ikke er en toString i selve klassen, så bruger man den fra Object.
Avatar billede nanders Nybegynder
18. september 2003 - 15:24 #11
Hej Conrad,

Jeg tror det snerper derhen ad. Jeg ønsker dog at den skal sige, at den leadsTo eksempelvis stuen, hvis den lige netop gør det, men er det muligt ?

/ nanders

NB. Nå jeg tester den med

import java.util.*;

public class Driver
{
    private Room Køkken;
    private Room Stue;

public void test()
    {
        Room køkken = new Room("Køkken");
        Room stue = new Room("Stue");
        køkken.connectTo(1,Stue);
        køkken.leadsTo(1);
        }
   
    }

Går den i ged.

/ nanders
Avatar billede conrad Nybegynder
18. september 2003 - 15:25 #12
jakoba>> lidt misledende at du selv gør det her: :)
a.roomMsg = "I retning " + dir + " er rummet" + (String)a;
Avatar billede conrad Nybegynder
18. september 2003 - 15:28 #13
Du skal bruge:
public Room leadsTo(int dir) {  // finkton ændret
     
        Room a = rooms.get(dir);
        a.roomMsg = "I retning " + dir + " er rummet" + a.name;
        return a;
        }
Avatar billede conrad Nybegynder
18. september 2003 - 15:33 #14
1) Som arne siger, enten returner du et Room eller en String, ikke en blanding
Avatar billede conrad Nybegynder
18. september 2003 - 15:34 #15
2) hold fast i min metode fra 15:18:57 som leverer et Room
Avatar billede nanders Nybegynder
18. september 2003 - 15:35 #16
Conrad, din kode virker ikke i min PC.

Jeg har lavet en toString som Jakob foreslår - kan jeg ikke anvende den på en eller anden måde ?

public String toString() {
      return this.name;
  }
Avatar billede conrad Nybegynder
18. september 2003 - 15:36 #17
3) lav en ny metode som benytter leadsTo() men returnerer en String fx:

public String strLeadTo(int dir)
{
Room a = rooms.get(dir);
return  "I retning " + dir + " er rummet" + a.name;

}
Avatar billede conrad Nybegynder
18. september 2003 - 15:37 #18
ups 3) skal være
public String strLeadTo(int dir)
{
Room a = leadsTo(dir);
return  "I retning " + dir + " er rummet" + a.name;

}
Avatar billede conrad Nybegynder
18. september 2003 - 15:39 #19
4) prøv at test med
import java.util.*;

public class Driver
{
    private Room Køkken;
    private Room Stue;

public void test()
    {
        Room køkken = new Room("Køkken");
        Room stue = new Room("Stue");
        køkken.connectTo(1,Stue);
        System.out.println(køkken.strLeadsTo(1));
        }
   
    }
Avatar billede nanders Nybegynder
18. september 2003 - 15:40 #20
Hej Conrad

Du og arne har nok ret.

Jeg tror jeg holder fast i det du foreslår.

Kan I også se hvad der er galt med min driver
Avatar billede nanders Nybegynder
18. september 2003 - 15:42 #21
import java.util.*;

public class Driver
{
    private Room Køkken;
    private Room Stue;

public void test()
    {
        Room køkken = new Room("Køkken");
        Room stue = new Room("Stue");
        køkken.connectTo(1,Stue);
        køkken.leadsTo(1);
        }
   
    }
Avatar billede jakoba Nybegynder
18. september 2003 - 15:43 #22
og hysk at  'stue'  er en helt anden variabel end  'Stue'  (med stort S)
Avatar billede nanders Nybegynder
18. september 2003 - 15:46 #23
Hvad betyder det i ovenstående ?
Avatar billede jakoba Nybegynder
18. september 2003 - 15:47 #24
i første linie staver du med lille. i anden linie med stort.
        Room stue = new Room("Stue");
        køkken.connectTo(1,Stue);
Avatar billede conrad Nybegynder
18. september 2003 - 15:48 #25
public class Driver
{
    private Room Køkken;//class scope dvs kan bruges i helke klassen
    private Room Stue;

public void test()
    {
        Room køkken = new Room("Køkken");//method scope dvs kan kun bruges i metoden
        Room stue = new Room("Stue");
        køkken.connectTo(1,Stue);
        køkken.leadsTo(1);
        }
   
    }
Avatar billede nanders Nybegynder
18. september 2003 - 15:52 #26
Så burde:

import java.util.*;

public class Driver
{
    private Room Køkken;
    private Room Stue;

public void test()
    {
        Room Køkken = new Room("Køkken");
        Room Stue = new Room("Stue");
        Køkken.connectTo(1,Stue);
        Køkken.leadsTo(1);
        }
   
    }

være i orden ?
Avatar billede conrad Nybegynder
18. september 2003 - 15:55 #27
Det vil kompile men Køkken og Stue vil kun være initialiserede inden i test() metoden. Hvis du vil initialisere dine class-variable skal du erstatte
Room Køkken = new Room("Køkken");
med this.Køkken = new Room("Køkken"); og det samme for Stue.
Avatar billede nanders Nybegynder
18. september 2003 - 16:01 #28
Hej Conrad,

Det virker faktisk stadig ikke.

Jeg ville mene at testen skulle resultere i, at leadsTo() blev kaldt af køkken og den fortalte at den var forbundet med Stue.
Avatar billede conrad Nybegynder
18. september 2003 - 16:18 #29
prøv med
import java.util.*;

public class Driver
{
    private Room Køkken;
    private Room Stue;

public void test()
    {
        this.Køkken = new Room("Køkken");
        this.Stue = new Room("Stue");
        Køkken.connectTo(1,Stue);
        System.out.println(Køkken.strLeadsTo(1));
        }
   
    }
Det er i øvrigt ikke standard at bruge stort begyndelsesbogstav til varible
Avatar billede nanders Nybegynder
18. september 2003 - 16:21 #30
Conrad, Arne og Jakob

Mange tak for jeres hjælp.

mvh

nanders
Avatar billede conrad Nybegynder
18. september 2003 - 16:26 #31
virker det?
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