2016-12-28 55 views
1

所以我有一個absract超類和一個子類,它擴展了超類中沒有在超類中聲明的字段。有沒有辦法從超類中訪問這些字段?我不能在超類中聲明這些字段,因爲它有其他可能沒有這些字段的子語句。你可以訪問未在超類中聲明的子類的字段嗎?

編輯,以使其更清晰:

,所以我做出某種店裏面有不同的項目。因此,我有一個名爲item的抽象類(帶有字段:價格),不同的項目是擴展項目類別以定義價格的對象。但也有一些特殊物品,其中同一物品的所有實例都有不同的ID,他們也會聲明它們的價格。 「購物者」必須能夠製作正常和特殊物品的「購物清單」,其中可以計算總價格,但是您還必須能夠從列表中看到特殊物品的編號。

編輯:我想實現的一個例子。

我做了一個小例子

//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 

類「法案」應該包含一個列表,它可以包括飲料以及LotteryTickets, ,對此總可以計算客戶必須是能夠做出這樣的賬單。 客戶類別還需要一種確認購買的方法,並檢查他的 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 
} 

您的購物車是忘卻,只是操作上可購買的東西:

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

當然,你也可以將一些標識,等等,以Buyable,就像你需要它。

+0

那麼我正在做一些有不同項目的商店。所以我有一個叫做物品的類(有一個字段:價格),不同的物品是物品,因爲它們只有價格而沒有別的東西。但也有一些特殊項目,其中每個項目的實例都有不同的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

我會添加一個例子 –

相關問題