2015-02-27 2 views
0

В Java я создаю класс под названием Room. Комната далее разделена на два типа комнат: подкласс под названием largeRoom и подкласс под названием smallRoom. Я пытаюсь написать метод mostExpensive(), который скажет мне, какая комната была самой дорогостоящей() для сборки. Я знаю, что если smallRoom и largeRoom были экземплярами Room, это было бы легко: я просто объявлял бы метод статичным. Однако я не уверен, как добиться такого же эффекта с подклассами. Любая помощь будет оценена!Как создать метод, который управляет всеми подклассами в Java

Благодаря

+0

Но SmallRoom и LargeRoom - это, безусловно, экземпляры комнаты. – laune

+0

В этом случае они являются подклассами комнаты. Номер является абстрактным классом – aaa

+0

И что? Они все еще являются экземплярами Room – laune

ответ

0

Будучи static или не имеют никакой прямой связи с супер и субтропических классов.

static члены являются членами, относящимися к class, а не конкретным object.

Для создания номера класса, вы можете сделать что-то вроде этого:

class Room{ //can be declared as abstract 
    int cost; 
    public int getCost(){return cost;} 
} 

class largeRoom extends Room{ 
    //inherit cost from Room class 
} 

class smallRoom extends Room{ 
    //inherit cost from Room class  
} 

написать метод mostExpensive(), который скажет мне, какой номер был mostExpensive(), чтобы построить.

Этот метод должен сравнивать коллекцию объектов Комнаты, поэтому вряд ли вы будете создавать этот метод в самих классах комнаты.

Если вы использовали ArrayList для хранения коллекции комнат.

public Room mostExpensive(ArrayList<Room> allRooms) 
{ 
    Room mostExpensiveRoom; 
    int max = 0; 
    for(int x=0; x<allRooms.size(); x++) 
     if(allRooms.get(x).getCost() > max){ 
      mostExpensiveRoom = allRooms.get(x); 
      max = allRooms.get(x).getCost();} 
    return mostExpensiveRoom; 
} 

Это показывает, как вы можете использовать метод mostExpensive().

public static void main(String[] args){ 
    List<Room> allRooms = new ArrayList<Room>(); 
    allRooms.add(new smallRoom()); 
    allRooms.add(new largeRoom()); 

    Room mostExpensiveRoom = mostExpensive(allRooms); 
} 

Если вы не хотите, чтобы перебирать коллекцию ручного поиска для самых дорогой комнаты, вы можете позволить классу номера реализовать comparable и отсортировать вашу коллекцию комнаты затем получить первую/последний запись из отсортированной коллекции. Я сомневаюсь, что вы это сделаете, но это одна из альтернатив.

+0

Кто меня опустил? Помните, почему? – user3437460

0

Вы могли бы написать это, в комнате, как это, если у вас есть абстрактная стоимость метода, реализованная в соответствии с требованиями SmallRoom и LargeRoom:

public static Room mostExpensive(Collection<Room> allMyRooms){ 
    int max = 0; 
    Room mostExp = null; 
    for(Room room: allMyRooms){ 
     if(room.cost() > max){ 
      max = room.cost(); 
      mostExp = room; 
     } 
    } 
    return mostExp; 
} 

Я предполагаю, что mostExpensive должен применяется к набору номеров:

List<Room> someRooms = ...; 
Room top = Room.mostExpensive(someRooms); 
+0

Значит, в этом случае все подклассы должны были бы назвать super.mostExpensive? Или они смогут просто позвонить самому дорого? – aaa

+0

Я предположил, что mostExpensive должен сравнить коллекцию комнат, чтобы определить ту, которая имеет самую высокую стоимость. См. Ответ, как позвонить. – laune

+0

Хорошо, поэтому я думаю, что это отвечает на мой вопрос. Так что, если вы создаете статическую переменную в классе, то статические переменные управляют всеми подклассами, потому что подкласс является технически экземплярами определенного класса. Это верно? – aaa

0

Я бы, вероятно, использовал компараторы и позвонил в коллекцию. то вы можете захватить самый дешевый (первый), самый дорогой (последний) или добавить компараторы для других показателей.

извините, я получаю деньги за работу, поэтому не могу включить пример кода :)

Смежные вопросы