2016-04-02 35 views
0

Javaの抽象クラスに関する質問があります。あなたは、私は2種類のアカウントを持って見たようJavaのメソッドの抽象クラス

public class userClass { 
private String email; 
String accountType; 
account account; 

public userClass(String email, String accountType){ 
    this.setEmail(email); 
    this.setAccountType(accountType); 

    if(accountType.equals("basic")){ 
      this.account = new basicAccount(); 
    } 
    else if(accountType.equals("premium")){ 
      this.account = new premiumAccount(); 
    } 
} 

: 私はこのような抽象クラスを作成している基本的な、プレミアム、彼らはアカウント抽象クラスの両方の拡張機能です。今ではプレミアムクラスにのみメソッドを追加したいと思いますが、そうしようとすると、アカウントクラスで実装する必要があるというエラーが表示されますが、これは嫌です。他の方法でそれを行うことは可能ですか?アカウントとbasicAccountクラスに空のメソッドを置かないようにするには?

+4

クラスは抽象ではありません...正しいコードを投稿しましたか? – Tunaki

+2

抽象クラスの1つの拡張機能にメソッドを追加することはできませんが、基本クラスには追加できません。より多くのヘルプのためにエラーを出す実際のコードを投稿してください。 – nhouser9

+0

'account'クラスの定義を追加してください。 –

答えて

2

だからあなたはAccountクラスのようにしている場合:あなたが持つことができる

public abstract class Account{ 
    public abstract void doSomethingAccountLike(); 
    //more stuff 
} 

子クラス:

public class BasicAccount extends Account{ 
    public void doSomethingAccountLike(){ 
     //implementation specific to basic accounts 
    } 
} 

public class PremiumAccount extends Account{ 
    public void doSomethingAccountLike(){ 
     //implementation specific to premium accounts 
    } 

    public void doSomethingPremiumLike(){ 
     //something that only makes sense 
     // in the context of a premium account 
    } 
} 

方法あなたがPremiumAccountすなわちのインスタンスを持っている場合doSomethingPremiumLike()にのみ利用可能です。

public class AccountDemo{ 
    public static void main(String[] args){ 
     PremiumAccount premium = new PremiumAccount(); 
     BasicAccount basic = new BasicAccount(); 
     Account generalAccount = premium; 

     //valid- the compiler knows that the 
     //premium object is an instance of the 
     //premium class 
     premium.doSomethingPremiumLike(); 

     //Would cause a compile error if uncommented. 
     //The compiler knows that basic is an instance 
     //of a BasicAccount, for which the method 
     //doSomethingPremiumLike() is undefined. 
     //basic.doSomethingPremiumLike(); 

     //Would generate a compiler error if uncommented. 
     //Even though generalAccount actually refers to 
     //an object which is specifically a PremiumAccount, 
     //the compiler only knows that it has a reference to 
     //an Account object, it doesn't know that it's actually 
     //specifically a PremiumAccount. Since the method 
     // doSomethingPremiumLike() is not defined for a general 
     //Account, this won't compile 
     //generalAccount.doSomethingPremiumLike(); 

     //All compile- all are instances of Account 
     //objects, and the method doSomethingAccountLike() 
     //is defined for all accounts. 
     basic.doSomethingAccountLike(); 
     premium.doSomethingAccountLike(); 
     generalAccount.doSomethingAccountLike(); 
    } 
} 

あなたの問題

あなたの問題は、クラスUserClassで、あなたはフィールドAccount accountを持っている可能性が高いと思います。コンストラクターでは、accountフィールドにnew BasicAccount()またはnew PremiumAccount()のいずれかを割り当てます。これは完全に問題ありませんが、一度それを行うと、は、accountフィールドがPremiumAccountインスタンスかBasicInstanceかをコンパイラが認識しなくなります。これは、account.doSomethingPremiumLike()を呼び出そうとすると、コンパイラエラーが発生することを意味します。あなたは、実行時にこの制限を回避することができます

if(account instanceof PremiumAccount){ 
    //if we're sure that account is actually a PremiumAccount, 
    //cast it to a PremiumAccount here to let the compiler know 
    //that doSomethingPremiumLike() can be called 
    ((PremiumAccount)account).doSomethingPremiumLike(); 
} 

注:

UserClassどこかで私は大文字で始めるためにあなたのクラスの名前を変更したJavaで一般的な慣例があるとして他のほとんどのOOP言語。他の人があなたのコードを読むのを助けるために、この大会に従うことの習慣に入るのは良いことです。

+0

はい、正確です。それはどのように見えるのですか?しかし、私のコードでは、オブジェクトを作成するときに、newAccount = new basicAccount();そのため、私はこの新しいメソッドdoSomethingPremiumLike()をアカウント抽象メソッドの中に入れなければならないというエラーが表示されます(そして、これはbasicAccountの中で私が避けたいものです) – gariaable

+0

あなたは、 BasicAccount account = new PremiumAccount()。次に、特定の方法を使用する場合は、アカウント変数をPremiumAccountにキャストします。 – Wukash

+0

しかし、この方法でオブジェクトを作成することは可能ですか? Eclipseでは、premiumAccount()の新しいオブジェクトを作成するために、 'account account'や 'basicAccount accont'のようにする必要があります。 – gariaable

関連する問題