だからあなたは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言語。他の人があなたのコードを読むのを助けるために、この大会に従うことの習慣に入るのは良いことです。
クラスは抽象ではありません...正しいコードを投稿しましたか? – Tunaki
抽象クラスの1つの拡張機能にメソッドを追加することはできませんが、基本クラスには追加できません。より多くのヘルプのためにエラーを出す実際のコードを投稿してください。 – nhouser9
'account'クラスの定義を追加してください。 –