2016-05-15 16 views
0

Ich habe eine Klasse mit dem Namen Gebäude erstellt, die eine Reihe verschiedener Arten von Räumen enthält, obwohl ich momentan nur eine Klasse habe. Ich versuche nun, auf eine Eigenschaft in einer Raumtypklasse zuzugreifen, aber aus irgendeinem Grund gibt es mir keinen Zugriff darauf.Zugriff auf öffentliche Klasseneigenschaft nicht möglich

Das ist meine Klasse:

public abstract class Building { 

    public RoomType roomType { get; private set; } 
    public RoomManager roomManager {get; private set;} 
    public int x {get; private set;} 
    public int y {get; private set;} 

    public Building(int x, int y, RoomManager rm, RoomType rT){ 
     SetPosition(x,y); 
     roomManager = rm; 
     roomType = rT; 
    } 
    void SetPosition(int tx, int ty){ 
     x = tx; 
     y = ty; 
    } 
} 

public class KitchenRoom : Building { 
     public Kitchen reference {get; private set;} 

     public KitchenRoom(int x, int y, RoomManager rM, Kitchen kitchen) : base(x,y,rM,RoomType.Kitchen){ 
      reference = elevator; 
     } 
} 

Also ich wie so eine neue KitchenRoom erstellen: Ich habe

//Buildings = List<Building>(); 
//I use type Building because there will be more than just KitchenRoom in this list eventually. 

buildings.Add(new KitchenRoom(x,y,go.getComponent<RoomManager>(),go.GetComponent<Kitchen>())); 

So dass ich jetzt den Wert zugreifen möchten reference so diese:

for(int i=0;i<buildings.Count; i++){ 
    if(buildings[i] is KitchenRoom){ 
     buildings[i].reference.someMethod(); // access to reference non existant 
    } 
} 

So scheint ich keinen Zugriff auf reference zu haben. Aber ich weiß nicht, was ich falsch gemacht habe.

Secondary minor Frage:

mir gesagt wurde, dass die Laufzeittypprüfungen aka mit is KitchenRoom ist keine gute Idee? Aber ich weiß nicht, wie ich das sonst tun soll. Gibt es da eine Wahrheit, sind das die besseren Implementierungen?

+0

Es gibt keine Klassenzimmer im Code genannt ist ..... – Programmer

+0

Leider i Gebäude nicht Zimmer gemeint :) bearbeitet. – Sir

+0

Ok. Juust hat festgestellt, dass du es noch redigierst – Programmer

Antwort

4

Das Problem besteht darin, dass Sie versuchen, auf eine Eigenschaft in Ihrer untergeordneten Klasse zugreifen, ohne es zuerst zu übertragen.

Die Eigenschaft reference nur in der Klasse existiert KitchenRoom, aber existiert nicht in Building

Um die reference Eigenschaft KitchemRoom zugreifen wollen, sollten Sie das Element KitchenRoom

Codebeispiel cast

for(int i=0;i<buildings.Count; i++){ 
    if(buildings[i] is KitchenRoom){ 
     ((KitchenRoom)buildings[i]).reference.someMethod(); // Cast to KitchenRoom first, then access 
    } 
} 

Nicht direkt mit Frage, sondern mehr, um fortzufahren, was in der Comme passiert nts.

Das Schlüsselwort is wird verwendet, um zu prüfen, ob ein Objekt von einem bestimmten Typ ist. Es führt KEINE Art von Casting durch, sondern dient dazu, zu überprüfen, ob ein Cast ohne Wurffehler durchgeführt werden kann.

Codebeispiel

public class Garden : NotBuilding { 
    //A class that does not inherit from Building 
} 


var aBuilding = new Building(); //An object of type building 
var aKitchenRoom = new KitchenRoom(); //An object of type KitchenRoom, which inherits from Building in your code 


Debug.Log(aBuilding is Building); //true 
Debug.Log(aKitchenRoom is Building); //true 
Debug.Log(aKitchenRoom is Garden); //false 
Debug.Log(aKitchenRoom is NotBuilding); //false 

Das as Schlüsselwort ist eine andere Art von Gießen, mit dem zusätzlichen Vorteil, keine InvalidCastException werfen, wenn eine Umwandlung fehlschlägt.

Codebeispiel

Eine weitere Möglichkeit, den Code zu schreiben, über

for(int i=0;i<buildings.Count; i++){ 
    var kitchenRoom = buildings[i] as KitchenRoom; //Cast to a KitchenRoom. Method returns null if it fails 
    if(kitchenRoom != null) 
     kitchenRoom.reference.someMethod(); 
} 
Verwandte Themen