Как я могу избежать Typecasting в C # в моем следующем коде - PullRequest
0 голосов
/ 05 октября 2019

У меня есть Базовый класс Room


public class Room
{
    public int width;
    public int height;
    public int minX;
    public int minY;

    public Room(int width, int height, int minX, int minY)
    {
        this.width = width;
        this.height = height;
        this.minX = minX;
        this.minY = minY;
    }

    public virtual void GenerateRoom()
    {
    }
 }

Есть два типа номеров ProcedualRoom и PredefinedRoom


public class ProcedualRoom: Room
{
   public ProcedualRoomData data;
}

 public class PredefinedRoom: Room
{
   public PredefinedRoomData data;
}

Оба класса имеют свои соответствующие данные, которые отличаются друг от друга ProcedualRoomData и PredefinedRoomData



В каком-то другом классе, где я загружаю все комнаты

ILoad[] objsToLoad = GetComponentsInChildren<ILoad>();
    foreach (Room r in procedualDungeon.rooms)
    {
        foreach (ILoad obj in objsToLoad)
        {
            obj.Load(r);
        }
    }

Когда я загружаю Комнату, я должен выполнить typecast, как это


 public void Load(Room room)
 {

    if (room is PredefinedRoom)
    {
        Load((room as PredefinedRoom).data);
    }
    else
    {
        ProcedualRoom pRoom = (room as ProcedualRoom);
        Load(pRoom);
    }
}

Есть ли какой-либо другой способ избежать типизации?

1 Ответ

1 голос
/ 05 октября 2019

Вы можете создать класс RoomData и добавить поле с этим типом в классе Room. ProcedualRoomData и PredefinedRoomData будут производными от RoomData

public class RoomData 
{
...
}  

public class  ProcedualRoomData: RoomData {
...
} 

public class  PredefinedRoomData: RoomData {
...
}

public class Room
{
    public RoomData data;
....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...