2014-10-28 4 views
0

Предположим, у меня есть класс Account,Должен ли я использовать InstanceOf в этом сценарии или мне нужно использовать полиморфизм

public class Account { 
    void Print(); 
} 

и я вывел два подкласса из него т.е. SavingsAccount и CheckingAccount.

public class SavingsAccount extends Account{ 
    void Print(); 
} 

public class CheckingAccount extends Account{ 
    void Print(); 
} 

Теперь предположим, что у меня есть класс драйвера позволяет говорить SimulateAccounts, который имеет список массив типа счета,

public class SimulateAccounts{ 
    ArrayList<Node> myAccounts = new ArrayList<Node>(); 
    void simulate() 
    { //suppose some function has added added 5 savingAccounts and 10 checkingsAccounts in myAccounts arraylist 

    } 

Теперь мой вопрос заключается в том, что я хочу, чтобы найти значение счетчика savingAccounts типа и checkingAccounts в arraylist myAccounts в вышеприведенной функции имитации, я могу сделать это, используя функцию instanceof. Но я смущен, используя его, поскольку я читал на многих местах, где использование instanceof - это плохая практика и запах кода, поэтому как я могу вместить в него полиморфизм, чтобы избежать использования instanceof или это нормально использовать. Более того, если я использую экземпляр и в будущем имя changeAccount изменений, я должен также обновить мой этот код в функции моделирования! Так что я должен делать здесь. Thanks

ответ

1

Если вы используете C# (ваши соглашения об именах указывают как Java, но и C#), вы можете просто использовать .OfType<CheckingAccount>().Count.

Но обязательно, используйте instanceof. Это не значит, что его следует использовать с осторожностью, именно тогда, когда вы определяете поведение подкласса, не предоставляя реализацию в самом классе.

Например:

if(account instanceof CheckingAccount) 
{ 
    // Do something 
} else if(account instanceof SavingsAccount) { 
    // Do another thing 
} 

В отличие от

account.DoAccountTypeSpecificThing(); 

То, что вы хотите сделать, имеет смысл.

+0

Использование ключевого слова 'extends' четко указывает на то, что Java – ortis

+0

видит свой тег« Java ». –

+0

См. Историю изменений. –

0

Вы можете использовать enum избежать instanceof:

public enum AccountType 
{ 
    Check, Saving 
} 


public class Account 
{ 
    void Print(); 
    AccountType getAccountType(); 
} 

public class SavingsAccount extends Account 
{ 
    void Print(){}; 

    AccountType getAccountType() 
    { 
    return AccountType.Saving; 
    } 
} 

public class CheckingAccount extends Account 
{ 
    void Print(){}; 

    AccountType getAccountType() 
    { 
    return AccountType.Check; 
    } 
} 

Теперь, если вы хотите знать тип с Account например:

Account a = ... 

switch(a.getAccountType()) 
{ 
case Check: 
    // do something specific to checking account 
    break; 

case Saving: 
    //do something specific to saving account 
    break; 

default: 
    break; 
} 

Кстати, использование extends для наследуется классов даже хуже, чем использование instanceof, на мой взгляд.

+0

что следует использовать вместо расширений? –

+0

Это просто мое мнение, но я обычно избегаю расширения класса. Я предпочитаю реализовать интерфейс. – ortis

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