2015-08-25 3 views
2

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

У меня есть это:

public static Contact createContact() { 

    Contact contact = null; 

    if (ContactUI.getRdb_acquaintance().isSelected()) { 
     contact = new Acquaintance(); 
    } else if (ContactUI.getRdb_friend().isSelected()) { 
     contact = new Friend(); 
     //contact.setStr_telMobile(ContactUI.getTxt_telMobile().getText()); 
    } else { 
     contact = new Family(); 
     //contact.setStr_telMobile(ContactUI.getTxt_telMobile().getText()); 
     //contact.setStr_BDay(ContactUI.getTxt_BDay().getText()); 
    } 

    setCommonDetails(contact); 

    return contact; 
} 

То, что я хотел бы, чтобы быть в состоянии назвать подклассов конкретные методы .setStr_telMobile и .setStr_BDay когда я инициализируется контакт, как один из его подклассов, но я получаю сообщение об ошибке, я не могут получить доступ к этим методам. Я прокомментировал строки в своем коде.

Я думал, что должен был инициализировать объект типа Contact to Friend (подкласс Contact), например, и получить доступ к специализированным методам и атрибутам подкласса.

+1

обеспечивают супер и суб реализации классов - методы, которые вы пытаетесь определить частью суперкласса? (есть контакт с классом или интерфейсом?) –

+0

Нет, это не так, как сказал оппонент.А Contact - это класс. – JacksOnF1re

+5

Если ваша переменная-член является типом контакта, вы можете использовать только методы, предоставляемые классом Contact. – JacksOnF1re

ответ

1

Как я уже сказал в комментарии, вы не можете получить доступ к методам из ваших подклассов, если ваш экземпляр суперкласса в качестве переменной-члена.

Если вам нужен доступ к реализациям подкласса, чем вам нужно выполнить.

if(contact instanceof Friend){ 
Friend friend = (Friend) contact; 
drinkBeerWith(friend); 
} 

Но, думать о другом шаблоне для реализации коды. Возможно, полиморфизм здесь не подходит. Показателем того, что концепция вашего дизайна может быть «неправильным», является использование instanceof.

Приветствие

Edit:

То, что я хотел бы, чтобы быть в состоянии назвать подклассы конкретных методов .setStr_telMobile и .setStr_BDay раз я инициализируется Связаться

Этих методов звука так как каждый Контакт имеет вид мобильного номера и день рождения, не так ли?

Если да, то реализовать методы как абстрактные методы в ваш супер класс и пусть подкласс overright их

public abstract void setStr_telMobile (String mobileNumber); 
+1

Спасибо! Я получил его на работу :) – oneteen

+0

Я рад, что он решил вашу проблему. Счастливое кодирование. – JacksOnF1re

1

Независимо от типа исполнения, contact является ссылкой на Contact типа. Таким образом, компилятор позволит вам использовать только методы Contact.

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

// Snipped 
} else if (ContactUI.getRdb_friend().isSelected()) { 
    Friend temp = new Friend(); 
    temp.setStr_telMobile(ContactUI.getTxt_telMobile().getText()); 
    contact = temp; 
} 
// snipped 

Кроме того, поскольку вы знаете, что вы присвоили contact с Friend например, вы можете явно обратное приведение его к Friend для доступа к методам:

// Snipped 
} else if (ContactUI.getRdb_friend().isSelected()) { 
    contact = new Friend(); 
    ((Friend) contact).setStr_telMobile(ContactUI.getTxt_telMobile().getText()); 
} 
// snipped 
+0

Спасибо большое! Я использовал этот downcasting, он отлично работает :) – oneteen

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