簡體   English   中英

OOP - 接口繼承抽象 class 替代

[英]OOP - Interface inheriting an abstract class alternative

假設我有一個接口IMazeRoom

這個接口有一個 function getAdjacentRooms()

此外,必須將 Mazerooms 實例化為IMazeRoom room1等。

(以上都不能改)

假設這些類正在實現接口:

TrapRoom, FreeRoom, MobRoom, TreasureRoom

我想在所有這些子類中使用以下函數/變量

Players[] playersInRoom, setSize(), isAdditionValid(Player p)

我想在不修改接口或在四個子類中復制代碼的情況下對上面的三個函數/變量使用繼承。

到目前為止我嘗試過的

制作實現IMazeroom的抽象接口MazeRoom,由四個子類實現。 這不起作用,因為該項目的限制是房間必須實例化為IMazeroom room ,如果我想使用上面提到的新功能,這樣做會導致實例化Mazeroom room IMazeRooms 也不能修改。

想法

我可能只是將另一個接口與我想要包含的功能一起使用,這將由 IMazeroom 實現,但這似乎很奇怪,因為這個約束應該在這里教我一些東西,而我看不到僅使用另一個接口的價值。 此外,使用另一個接口並不能真正減少代碼重復,我正在尋找更像抽象 class 的東西

(以上是與我的家庭作業任務完全不同的示例,因為我想自己嘗試該任務)

編輯:由於我們無法更改界面,您可以使用實現 IMazeRoom 的DefaultRoom class。

public class DefaultRoom implements IMazeRoom {

    protected Players[] playersInRoom;

    /* your standard method implementations */
    public boolean isAddtionValid(Player p) {
        ...
    }
}

public interface IMazeRoom {
    ...
}

由於您必須通過IMazeRoom myIMazeRoomObject = new DefaultRoom()來實例化它,只要您知道您正在處理哪種房間,您就可以簡單地將其轉換回:

try {
    DefaultRoom myRoom = (DefaultRoom) myIMazeRoomObject;
} catch(ClassCastException ex) {
    // we didn't get a DefaultRoom object and now we have to handle that
}

旁注:需要注意的重要一點是,該接口僅實現必要的方法getAdjacentRoom ,因此它僅構成依賴於getAdjacentRooms()的某些(任意)布局的信息。 您的次要約束(不可變接口 + 實例化)使得有必要規避正確的 OO 架構不應該發生的事情。

您可以將常見的具體實現分離為抽象的 class 並保留接口。

基於“我不允許更改界面”的粗略示例:

IMazeRoom:

public interface IMazeRoom {
    Set<IMazeRoom> getAdjacentRooms();
}

常見的具體實現:

public abstract class CommonRoom {

    private final int size;
    private final Set<Player> playersInRoom;
    private final Set<IMazeRoom> adjacentRooms;

    protected CommonRoom(int size, Set<Player> playersInRoom, Set<IMazeRoom> adjacentRooms) {
        this.size = size;
        this.playersInRoom = playersInRoom;
        this.adjacentRooms = adjacentRooms;
    }

    public int getSize() {
        return size;
    }

    public Set<Player> getPlayersInRoom() {
        return playersInRoom;
    }

    public Set<IMazeRoom> getAdjacentRooms() {
        return adjacentRooms;
    }

    public boolean isAdditionValid(Player player) {
        // Some kind of implementation returning true or false...
        return !playersInRoom.contains(player);
    }
}

陷阱室:

public class TrapRoom extends CommonRoom implements IMazeRoom {

    public TrapRoom(int size, Set<Player> playersInRoom, Set<IMazeRoom> adjacentRooms) {
        super(size, playersInRoom, adjacentRooms);
    }
}

寶庫:

public class TreasureRoom extends CommonRoom implements IMazeRoom {

    public TreasureRoom(int size, Set<Player> playersInRoom, Set<IMazeRoom> adjacentRooms) {
        super(size, playersInRoom, adjacentRooms);
    }
}

... 與額外房間的 TreasureRoom 相同。

評論:現在所有房間都被視為 IMazeRoom...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM