【问题标题】:Should i use instanceof in this scenario or i need to use polymorphism我应该在这种情况下使用 instanceof 还是需要使用多态性
【发布时间】:2014-10-28 17:39:49
【问题描述】:

假设我有一个 Account 类,

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 或者可以使用。此外,如果我使用 SavingAccount 更改的实例和未来名称,我还需要在模拟函数中更新我的此代码!那么我应该在这里做什么。 谢谢

【问题讨论】:

    标签: java inheritance polymorphism instanceof


    【解决方案1】:

    如果您使用的是 C#(您的命名约定同时表示 Java 和 C#),则可以使用 .OfType&lt;CheckingAccount&gt;().Count

    当然,请继续使用instanceof。这不是应该谨慎使用它的原因,而是当您定义子类特定的行为而不在类本身中提供实现时。

    例如:

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

    相对

    account.DoAccountTypeSpecificThing();
    

    你想做的事是有意义的。

    【讨论】:

    • 关键字extends的使用明确表示Java
    • 查看修订历史。
    • 我正在使用 Java,但问题更多的是在我给出的情况下可以避免使用 instanceof 吗?
    【解决方案2】:

    您可以使用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 还要糟糕。

    【讨论】:

    • 应该用什么代替extends?
    • 这只是我的意见,但我通常避免扩展课程。我更喜欢实现接口。
    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2017-03-05
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多