假设我有一个帐户类
public class Account {
void Print();
}
我从它派生了两个子类,即SavingsAccount和CheckingAccount。
public class SavingsAccount extends Account{
void Print();
}
public class CheckingAccount extends Account{
void Print();
}
现在假设我有一个驱动程序类,可以说SimulateAccounts有一个类型为Account的数组列表,
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
}
现在我的问题是我想在上面的模拟函数中找到arraylist myAccounts中的savingAccounts和checkingAccounts类型的计数,我可以通过使用instanceof函数来做到这一点。但是我对使用它感到困惑,因为我已经阅读了很多地方使用instanceof是不好的做法和代码味道,所以我如何将多态融入其中以避免使用instanceof或者可以使用它。此外,如果我使用的实例以及将来saveCount帐户更改的名称,我还需要在模拟功能中更新我的代码!那我该怎么办呢 感谢
答案 0 :(得分:1)
如果您正在使用C#(您的命名约定同时表示Java和C#),则可以使用.OfType<CheckingAccount>().Count
。
但是请确保,继续使用instanceof
。这并不是为什么应该谨慎使用它,当你定义子类特定的行为而不在类本身提供实现时。
例如:
if(account instanceof CheckingAccount)
{
// Do something
} else if(account instanceof SavingsAccount) {
// Do another thing
}
与
相反account.DoAccountTypeSpecificThing();
你想做的事情是有意义的。
答案 1 :(得分: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
更糟糕。