2012-01-13 2 views
0

Мой вопрос касается наследования и полиморфизма.понимание Наследование и полиморфизм

У меня есть класс A который супер класс. Классы B и C распространяется A и являются подклассами.

Теперь у меня есть функция в другом классе (не A или B или C), который принимает аргумент типа A. Таким образом, полиморфизм позволяет нам передать аргумент как A, B или C к этой функции. Теперь в этой функции, чтобы получить доступ к свойствам B, я должен придать полученному аргументу тип B.

Является ли тип отличной хорошей техникой программирования? Если нет, то какой здесь полиморфизм?

Спасибо.

+0

Пособие представляет собой повторное использование кода и обеспечивает различное поведение. поэтому он так и называется полиморфизмом. – DarthVader

+0

Вы имеете в виду, что в вашем методе вы хотите объект типа ** A ** (и, следовательно, также его подклассы), но если объект имеет тип ** B **, вы хотите получить доступ к свойствам, которые являются конкретными на ** B ** (т. е. недоступны в ** A **)? – DarkDust

+0

точно, вот что я ищу – nik7

ответ

1

Typecasting полезен, если вы знаете, что делать.

Использование полиморфизма здесь заключается в том, что метод в другом классе может быть написан общим образом, и один кусок кода может, таким образом, работать на разных типах, которые, однако, имеют некоторый интерфейс (класс A) в общий.

Итак ... типизация (в зависимости от языковой культуры) очень плохая практика. Использование полиморфизма является предпочтительным (в зависимости от ...), таких как создания другого метода с подписью ->(B), принимая аргумент типа B.

Update: добавлен Java псевдокод

class A { int m() {} } 
class B extends A { int b() {} } 
class C extends A {} 
class $ { 
    static void x(A $$) {} 
    static void x(B $$) {} 
} 
public class P { 
    public static void main(String[] a) { 
    $.x(new A()); //calls $::x(A) 
    $.x(new B()); //calls $::x(B) 
    } 
} 
+0

Так хорошо, если я использую оператор instanceof для аргумента и typecast для B, если он имеет тип B? – nik7

+0

Да, это должно быть безопасно, но для ясности/красоты предпочтительны отдельные методы. –

+0

Если я создаю другой метод с сигнатурой B, то, если я вызываю метод, мне нужно проверить тип аргумента и вызвать метод соответствующим образом. Разве это не сложнее? – nik7

0

Я предполагаю, что вы хочу что-то вроде этого (псевдокод):

void foo(A obj) { 
    if (obj.isOfClass(B)) { 
     // Access a property that B has, but A doesn't. 
    } 
} 

в этом случае вам нужно типаж:

void foo(A obj) { 
    if (obj.isOfClass(B)) { 
     ((B)obj).propertyOfB(); 
    } 
} 

В зависимости от языка существует альтернативный способ. В таких языках, как Ruby и Objective-C, так называемый duck typing используется очень часто, вместо того, чтобы проверять, имеет ли объект определенный тип. Идея такова: если она ходит, как утка и шарлатанцы, как утка, это, должно быть, утка. Другими словами, здесь это не так важно, что тип объект имеет, но реализует ли он определенный методы:

void foo(Object obj) { 
    if (obj.hasMethod(quack)) { 
     obj.quack(); 
    } 
} 

Языки, в которых утиной типизации часто используется, как правило, более более " динамичный "характер. Например, в C++ с очень строгой системой типов практически невозможно делать утиную печать (AFAIK), в то время как в Ruby и Objective-C это довольно естественно.

+0

Я использую java. Я предполагаю, что Typecasting - единственный способ? Опять же, приписывает хороший метод программирования? – nik7

+0

В Java typecasting - единственный способ. Независимо от того, хорошо ли этот стиль зависит от варианта использования. Если использовать с мыслью и редко, это не имеет большого значения. Но если вы заметите, что вы бросаете снова и снова, вы, вероятно, должны переосмыслить свою иерархию классов или как абстрагировать вещи по-другому (интерфейсы). – DarkDust

+0

ОК, Спасибо за помощь. Очень признателен. – nik7

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