Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java继承问题:确定合适的子类_Java_Oop - Fatal编程技术网

Java继承问题:确定合适的子类

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

我有一个抽象类,叫做account,如下所示-

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()

必须要求子类指定
类型
,如果所有帐户构造函数