2013-02-18 2 views
2

К сожалению, я новичок только начинал с использованием Java, и я столкнулся с этой проблемойУстановка объекта неизвестного типа класса в Java

У меня есть два класса, говорят, что они

class Dog { 

} 

class Cat { 

} 

затем я создал массив, который заполняется с любым из этих двух

Object[][] myAnimal = new Object[4][5]; 

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

+2

Вы можете проверить класс объекта во время выполнения ('obj.getClass()'), но это не обязательно избавит вас от плохого дизайна. Что вы пытаетесь достичь? – Perception

+0

if (myAnimalObj instanceof CAT) или if (myAnimalObj instanceof CAT) – Jayamohan

+0

Хорошо, я пытаюсь имитировать игру, где у вас есть кошка или собака, и в зависимости от того, какие вещи должны произойти. Я прокручиваю свой массив и пытаюсь установить переменную, равную текущей ячейке, а затем использовать оператор if, чтобы проверить, является ли это собакой или кошкой. –

ответ

1

Ну, если предположить, что ваш массив заполняется экземплярами одного из двух классов, вы могли бы сделать что-то вроде:

if(myAnimal[x][x] instanceof Dog) //it is an instance of the Dog class 

Вы действительно не должны делать вещи, как это особенно, как новичок, хотя. Вы сказали, что пытаетесь выбрать случайную собаку или кошку? Лучше всего было бы сохранить два отдельных массива, один для собак и один для кошек. Затем вы можете выбрать случайный элемент из двух массивов, и вы узнаете, с каким классом вы имеете дело.

+0

О, хорошо. хорошо, если я делаю пример, который вы дали, могу ли я установить новый объект на текущий. Как собака myDog = myAnimal [x] [x]? –

+0

Хорошая вещь о том, чтобы иметь их в двух отдельных массивах, заключается в том, что вы можете создать массив класса Dog и массив класса Cat. Поэтому, когда вы это сделаете, вам не нужно будет создавать новый объект. Вы могли бы просто сказать, что мое случайно выбранное животное - catArray [5]. Вы можете работать с этим элементом в массиве. например catArray [5] .someCatFunction() –

+0

Я должен просто сказать, что решение массива будет работать, но то, что вы действительно ищете, - это создать классное животное, такое как Code-Guru. Таким образом, у вас может быть множество животных, которые могут быть кошкой или собакой. –

0

Я думаю, вы должны использовать отражение api, если вы хотите, чтобы этот экземпляр класса, его необходимо проверить любой объект во время выполнения ... Я думаю, что ваш вопрос заключается в том, что вы не хотите ставить условие статическое и как установить условие динамично для разных животных, сегодня его собака, тигр подражает своей корове или т. д. ... поэтому PLZ использовать refelction api

3

Идеальное решение для создания собственного суперкласса, скажем Animal, который объявляет абстрактные методы. Например, вы можете сделать:

abstract class Animal { 
    public abstract void speak(); 
} 

Тогда Cat и Dog каждый из них предоставляет свои собственные реализации для абстрактного метода:

class Cat { 
    public void speak() { 
     System.out.println("Meow!"); 
    } 
} 

class Dog { 
    public void speak() { 
     System.out.println("Woof!"); 
    } 
} 

Теперь вы можете просто объявить массив в качестве

Animal[][] myAnimal = new Animal[4][5]; 

Поместите некоторых животных в массив:

myAnimal[0][0] = new Dog(); 
myAnimal[0][1] = new Cat(); 

А потом говорят животные говорить:

myAnimal[0][0].speak(); 
myAnimal[0][1].speak(); 

Я ушел из синтаксиса main() здесь, но я надеюсь, что вы можете поставить это вместе себя. Используемые здесь понятия называются «полиморфизм». Я настоятельно рекомендую вам изучить его, чтобы помочь вам использовать эту важную концепцию OO при разработке кода.

+0

, не создавая отдельный класс, могу ли я просто вызвать методы, как вы указали. Как если бы (instanceof Dog) {myAnimal [0] [0] .speak()} –

+0

@BillyThompson 'instanceof' - это двоичный оператор. Это означает, что ему нужны * два аргумента, такие как 'if (myAnimal [0] [0] instanceof Dog) {myAnimal [0] [0] .speak();}'. И да, вы можете * сделать это, если 'Animal' имеет конкретный метод' speak() '. Тем не менее, он будет делать то же самое независимо от того, является ли животное собакой или кошкой. Предложение, которое я даю в моем ответе, иллюстрирует концепцию полиморфизма. Одно из преимуществ заключается в том, что вы устраняете необходимость в операторах 'if', например, как вы предлагаете. Вы также можете легко добавить больше животных, таких как «Лошадь», «Корова», «Овечка», «Утка» и т. Д. С гораздо меньшим количеством кода. –

1

Шаблон посетителя был бы действительно хорошим подходом к рассмотрению в такой ситуации. Скажем, вы делаете игру, которая должна реагировать по-разному на разные объекты (Cat, Dog, Money и т. Д.). Так что это:

сделать интерфейс IAnimal, который имеет следующее определение:

interface IAnimal { 
    void visit(IAnimalVisitor visitor, Object param); 
} 

class Cat implements IAnimal { 
    void visit(IAnimalVisitor visitor, Object param) { 
     visitor.visit(this, param); 
    } 
} 

class Dog implements IAnimal { 
    void visit(IAnimalVisitor visitor, Object param) { 
     visitor.visit(this, param); 
    } 
} 

IAnimalVisitor будет содержать один visit() метод для каждого типа животных определены.Так оно и будет:

interface IAnimalVisitor { 
    public void visit(Cat c, Object param); 
    public void visit(Dog c, Object param); 
} 

Тогда вы могли бы использовать свою логику для борьбы с кошкой и собакой по вашему желанию. Например:

class AnimalFeeder implements IAnimalVisitor { 
    public void visit(Cat c, Object param) { 
     c.feed(milk); 
     c.feed(cat_food); 
    } 
    public void visit(Dog d, Object param) { 
     d.feed(dog_food); 
    } 
} 

Затем вы можете использовать выше пищевого класса кормления, чтобы кормить вас IAnimal массив как это:

IAnimal[] animals = new IAnimal[] { new Cat(), new Dog(), 
    new Dog(), new Cat() }; 

IAnimalVisitor feeder = new AnimalFeeder(); 
for(IAnimal animal : animals) { 
    animal.visit(feeder, null); 
} 

Вы можете достичь полной свободы, чтобы иметь дело с любым уровнем иерархии внутри классов. Просто поставьте visit() для каждого типа класса животных в пределах IAnimalVisitor.

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