Java继承问题:确定合适的子类
我有一个抽象类,叫做account,如下所示-Java继承问题:确定合适的子类,java,oop,Java,Oop,我有一个抽象类,叫做account,如下所示- abstract class Account { private int number; private String owner; public Account(int accountNumber, String accountOwner) { number = accountNumber; owner = accountOwner; } public int
abstract class Account
{
private int number;
private String owner;
public Account(int accountNumber, String accountOwner)
{
number = accountNumber;
owner = accountOwner;
}
public int getAccountNumber(){ return number; }
public String getAccountOwner(){ return owner; }
public abstract double getBalance();
public abstract double makeDeposit(double amount);
public abstract double makeWithdrawal(double amount);
}
Account[] accounts
此类定义帐户的基本框架。通过继承该类,将创建几个专门的帐户类,例如MarketSavingsAccount
,RegularSavingsAccount
等
现在我有一个数组,声明如下-
abstract class Account
{
private int number;
private String owner;
public Account(int accountNumber, String accountOwner)
{
number = accountNumber;
owner = accountOwner;
}
public int getAccountNumber(){ return number; }
public String getAccountOwner(){ return owner; }
public abstract double getBalance();
public abstract double makeDeposit(double amount);
public abstract double makeWithdrawal(double amount);
}
Account[] accounts
其中包含帐户列表。在此阵列中,可以使用不同类型的帐户。现在,我如何确定这些数组成员中的哪一个是MarketSavingsAccount
的实例
accounts[0] instanceof MarketSavingsClass
还是动态版本
MarketSavingsClass.class.isInstance(accounts[0])
(向下滚动至“类型比较运算符instanceof”)
还是动态版本
MarketSavingsClass.class.isInstance(accounts[0])
(向下滚动到“类型比较运算符instanceof”)您可以在数组中循环,并使用
instanceof
运算符确定当前元素是否为MarketSavingsClass
的实例
类似于此(未经测试):
也就是说,你需要重新审视你的设计。除了极少数情况外,您不必键入check。您可以在数组中循环,并使用
instanceof
操作符来确定当前元素是否是MarketSavingsClass
的实例
类似于此(未经测试):
也就是说,你需要重新审视你的设计。除了极少数情况外,你不应该进行打字检查。从纯面向对象的角度来看,你不应该在意;您应该避免降级,并对所有帐户实例一视同仁 但足够的理论-您可能正在寻找
实例,如
Account a = accounts[0];
if (a instanceof MarketSavingsAccount)
{
...
}
从纯面向对象的角度来看,你不应该在意;您应该避免降级,并对所有帐户实例一视同仁
但足够的理论-您可能正在寻找实例,如
Account a = accounts[0];
if (a instanceof MarketSavingsAccount)
{
...
}
考虑工厂设计模式。这是为完成任务而做的
- 创建一个名为Account的接口,该接口定义accounts需要的所有方法
- 创建一个工厂类,如下所示:
公营会计工厂{
公共静态帐户生成([参数]){
Account specificInstance=null;
//做任何必要的逻辑来确定你需要的账户类型。
返回具体实例;
}
}
您必须为make()提供足够的信息,以决定哪种类型的帐户实现是合适的
- 创建您的MarketSavingAccount,
定期储蓄等
执行帐户
- 让AccountFactory.make()确定正确的帐户
要使用并返回到的实现
你可以举个例子
您的代码主线代码不应该关心正在处理的帐户类型。考虑工厂设计模式。这是为完成任务而做的
- 创建一个名为Account的接口,该接口定义accounts需要的所有方法
- 创建一个工厂类,如下所示:
公营会计工厂{
公共静态帐户生成([参数]){
Account specificInstance=null;
//做任何必要的逻辑来确定你需要的账户类型。
返回具体实例;
}
}
您必须为make()提供足够的信息,以决定哪种类型的帐户实现是合适的
- 创建您的MarketSavingAccount,
定期储蓄等
执行帐户
- 让AccountFactory.make()确定正确的帐户
要使用并返回到的实现
你可以举个例子
您的代码主线代码不应该关心正在处理的帐户类型。而不是使用instanceof
,因为前面提到的原因,instanceof不太面向对象——具体来说,您应该在面向对象设计中使用多态性,您可以在account类中指定帐户类型并检查它,而无需使用instanceof
,而是使用getAccountType()
必须要求子类指定类型
,如果所有帐户构造函数都有类型
参数,编译器将强制执行此操作。对于instanceof
,没有编译时检查Account
的所有子类是否被处理。您必须确保代码处理所有枚举值,但这通常比尝试了解和处理Account的所有子类更为困难,因为类型
枚举被指定为Account数据类型的一部分
现在,如果每个帐户都有不同的行为,那么应该在帐户的子类内或至少通过帐户的子类,而不是通过检查类型并执行特定操作的代码,以多态方式处理该行为,但是如果您只想查找特定类型的帐户,将该类型作为Account对象的属性将允许您避免依赖于了解实现每个特定帐户类型的类
public class MarketSavingsAccount extends Account
{
MarketSavingsAccount(int accountNumber, String accountOwner)
{
super(Type.MARKET_SAVING, accountNumber, accountOwner);
}
...
}
也许还有其他一些MarketSavingsAccount的实现需要被视为市场储蓄类型的账户:
public class OtherMarketSavingsAccount extends Account
{
OtherMarketSavingsAccount(int accountNumber, String accountOwner)
{
super(Type.MARKET_SAVING, accountNumber, accountOwner);
}
...
}
如果您有只想查找市场储蓄帐户的代码,您只需迭代数组并对.market_saving类型的代码执行操作,该类型包括MarketSavingsAccount和OtherMarketSavingsAccount以及您可能拥有的任何其他实现
for (Account account : accounts) {
if (account.getAccountType() == Type.MARKET_SAVING) {
addToDirectMailAccountsList(account); // Or whatever
}
}
与使用instanceof
(由于前面提到的原因,它不是非常面向对象的)不同——具体地说,您应该在面向对象设计中使用多态性,您可以在account类中指定帐户类型并检查它,而不使用instanceof
,而是使用getAccountType()
必须要求子类指定类型
,如果所有帐户构造函数