2016-12-28 13 views
1

私は、absractスーパークラス、およびスーパークラスで宣言されていないフィールドでこのスーパークラスを拡張するサブクラスを持っています。スーパークラス内からそれらのフィールドにアクセスする方法はありますか?これらのフィールドはスーパークラスに宣言できません。なぜなら、これらのフィールドを持たないサブクラスがあるからです。それをより明確にするためにスーパークラスで宣言されていないサブクラスのフィールドにアクセスできますか?

編集

だから私は、さまざまなアイテムを持っているお店のいくつかの種類を作っています。したがって、私はアイテムと呼ばれる抽象クラス(フィールド:価格)を持っており、異なるアイテムは、アイテムクラスを拡張して価格を定義するオブジェクトです。しかし、同じアイテムのすべてのインスタンスが異なるIDを持っている特別なアイテムもあります。また、そのアイテムの価格も宣言しています。 「買い物客」は、通常価格と特別価格の両方の商品の「買い物リスト」を作ることができなければなりません。合計価格を計算することができますが、リスト内の特別商品のIDも確認できる必要があります。

:達成したいものの例。

ドリンクだけでなく、合計を算出することができるとお客様がなければならない いるLotteryTicketsを含むことができ、リストが含まれている必要があり、私はクラスのビル少し '例

//The numbers are different for each ticket 
// and are used to denote a winner in the end. 
abstract class LotteryTicket(val numbers: String) { 
    val price: Int 
} 

class GoldTicket(numbers: String) extends LotteryTicket(person) { 
    val price: Int = 10 
} 

class SilverTicket(numbers: String) extends LotteryTicket(person) { 
    val price: Int = 5 
} 

abstract class Drink { 
    val price: Int 
} 

object Water extends Drink { 
    val price: Int = 1 
} 

object Coffee extends Drink { 
    val price: Int = 2 
} 

class Bill 

class Customer 

を作りましたそのような法案を作ることができる。 また、Customerクラスでは購入を確認し、購入したチケットごとに LottoryTicketの番号が異なるかどうかを確認するメソッドが必要です。彼が2枚のチケットで同じ番号を持っているので、 確認が失敗します。

答えて

0

非常に汚いトリックに頼ることなく、私は強くお勧めします。クラス階層にはいくつかの問題があるようですが、具体的な例がなくても正確なアドバイスをするのは難しいですが、スカラでは主に継承ではなく特性で構成を見ていきます。あなたの問題のために、あなたはショッピングカート

trait Buyable { 
    def price: Int 
} 

にドロップすることができますすべてのために形質を作ることができ、その後、あなたがショッピングカートに上陸することができるようにしたいものへのその形質を混ぜます。そのようにして、あらゆる種類の製品の小さな継承ツリーを構築し、その特性を追加することができます。例えば

class Drink extends Buyable { 
    // Drink can set the price for all its subclasses 
    override def price = ... 
} 

abstract class LotteryTicket extends Buyable { 
    // LotteryTicket cannot, so it's abstract 
} 
class SilverTicket { 
    override def price = 20 
} 

ショッピングカートを忘れている、ちょうどBuyableものに動作します。もちろん

class ShoppingCart { 
    def add(b: Buyable) ... 
} 

を、あなたも、あなたがそれを必要とするだけのように、Buyableに、エトセトラ、いくつかの識別子を移動することができます。確かに推奨されていないが

+0

まあ、私は別のアイテムを持つ何らかの種類のショップを作っています。だから、クラスと呼ばれるアイテム(フィールド:価格)と異なるアイテムは、オブジェクトのため、彼らは価格と他に何もないので。しかし、アイテムのすべてのインスタンスが異なるIDを持つ特別なアイテムもあります。 「買い物客」は、通常価格と特別価格の両方の商品の「買い物リスト」を作ることができなければなりません。合計価格を計算することができますが、リスト内の特別商品のIDも確認できる必要があります。 –

2

(それは設計上の欠陥を意味しますので、 - あなたが手でサブクラスを持っているかどうかわからないが、あなたはまだそのメソッドを呼び出すことに興味を持っている)、ここではいくつかのオプションがあります:

trait A { 
    // pattern-match to doStuff only if B: 
    this match { 
    case b: B => b.doStuff() 
    case _ => // do nothing 
    } 

    // check if type is B (not recommended) 
    if (this.isInstanceOf[B]) { 
    this.asInstanceOf[B].doStuff() 
    } 
} 

class B extends A { 
    def doStuff() {} 
} 
+0

ここで正確に特性AであなたはBのフィールドにアクセスしていますか? (試してもしないでください) – haffla

+0

oops - 質問を間違って読んでも... ... –

+0

私は達成したいと思っていたものが良くないので、私は実際に何をしたいのかの例を書いた。これは簡単な方法で可能ですか? –

1

一般に、これはオブジェクト指向プログラミングの原則では利用できません。あなたがコードを上書きして別の特別価格の抽象フィールドを作成する必要があるかもしれません。それ以外の場合は、サブクラスのフィールドをアクセス可能にするために、基本クラスのサブクラスをインスタンス化する必要があります。私はこれがあなたを助けるかどうかは分かりませんが、クラスの構造や何をしようとしているのかを投稿することができれば分かりません。私はそれが多くを助けると思う。

+0

例を追加します –

関連する問題