Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2011, 23:49   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Как обратиться к методу потомку ?

Собственно имеется базовый класс:
Код:
public class Smth {
// тут конструкторы, сеттеры/геттеры и прочее
}
Есть его потомок(на практике их несколько):
Код:
public class C1 extends Smth {
//и тут вот ест ьнекий метод, которого нет в родителе
public void todoSome {
}
}
Создаю коллекцию:
Код:
ArrayList<Smth> mSmth;
Добавляю в него пару объектов:
Код:
mSmth.add(new Smth());
mSmth.add(new C1());
но как теперь обратиться к методу todoSome из 2го элемента списка?
[MI_nor] вне форума Ответить с цитированием
Старый 21.03.2011, 23:55   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Воспользоваться приведением:
Код:
((C1)mSmth.get(1)).todoSome(...);
netrino вне форума Ответить с цитированием
Старый 22.03.2011, 01:23   #3
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию

А если таких потомков несколько (C1, C2 ...) и непонятно какой находится в элементе ?
[MI_nor] вне форума Ответить с цитированием
Старый 22.03.2011, 01:48   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вообще выглядит подозрительно, по возможности нужно избегать такой иерархии. Но если так и планировалось, то :
Код:
if (someObject instanceof C1)
  ((C1)someObject).someC1Method();
else if (someObject instanceof C2)
  ((C2)someObject).someC2Method();
else ...

Последний раз редактировалось netrino; 22.03.2011 в 01:56.
netrino вне форума Ответить с цитированием
Старый 22.03.2011, 08:13   #5
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

netrino прав. Нужно изменить структуру классов. Лично я бы сделал следующее:

Код:
interface MyA
{
	public void f();
}

class B implements MyA
{
	public void f()
	{
		System.out.println("B->f()");
	}
}

class C implements MyA
{
	public void f()
	{
		System.out.println("C->f()");
	}
}

public class Test {

	public static void main(String[] args) {
		ArrayList<MyA> arr = new ArrayList<MyA>(0);
		
		arr.add(new B());
		arr.add(new C());
		
		for(int i = 0; i < arr.size(); i++)
			arr.get(i).f();
	}
}
Таким образом воспользовавшись удобствами, которые нам предоставляет полиморфизм .
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к ячейке? baddog БД в Delphi 2 30.04.2010 15:43
Как обратиться к текстовому окну caveman Общие вопросы Delphi 0 27.09.2009 14:35
F1Book. как обратиться к ячейке? ira_sweet Общие вопросы Delphi 0 28.05.2009 20:17
Как обратиться к активной форме? Dimon88 Помощь студентам 4 18.10.2008 00:03
Как из проги обратиться к Excel ? Drozd Общие вопросы Delphi 3 26.03.2008 18:24