2012-11-23 70 views
1

對不起,但我是斯卡拉新手。 我有一個抽象類和一個從抽象類繼承並實現其字段的具體類。對構造函數參數的限制

abstract class Element { 
    var name: String 
    var description: String 
} 

class ConcreteElement (var name: String, var description: String)extends Element 

是對不起?是? 我有很多從抽象類Element繼承的類。 現在我想對變量名稱進行檢查,我想僅根據某些約束來實例化名稱。我在哪裏把這個控制?顯然在抽象類Element中。

Scala中的一個變量聲明VAR X:T是相當於吸氣函數x和setter函數X_ =,定義爲聲明如下:

def x: T 
def x_= (y: T): Unit 

所以決定以這種方式來聲明變量並在getter方法名稱中定位我的約束。

abstract class Element {  
def name: String 
def name_= (y: String): Unit = {CONSTRAINT} 

var description: String 
} 

類ConcreteElement(VAR名:字符串,Var描述:字符串)擴展元素

這種推理是正確的? ConcreteElement實際上實現了Element的字段?

+0

你真的需要在你的上下文中的可變字段(變量)嗎? –

+0

某些字段類型爲Set(something)的String類型。 我認爲沒有必要使用var。 但是,如果我不使用var,我怎樣才能設置約束方法設置器 – user1826663

回答

1

您的def name_=只有在未被子類覆蓋時纔有效。所以我想你需要final來防止它被覆蓋。

abstract class Element { 
    protected var _name: String 
    final def name: String = _name 
    final def name_= (value: String) { 
    if (isBadValue(value)) throw new IllegalArgumentException 
    _name = value 
    } 
    var description: String 
} 
class ConcreteElement (protected var _name: String, var description: String) extends Element 
+0

非常感謝您的答案。 不好意思,但也許我不是很清楚。 我有一個模型域的包。由抽象和具體類組成。 在另一個包中,我想實現一個DSL來實例化我的類。 域中的某些字段有約束。他們不能接受所有的價值。 您提出的解決方案並不能解決我的問題。 我繼承的_name不會被測試。對? 另外,如果我在不同的包裝中工作,我可以使用保護? – user1826663

+0

您的'ConcreteElement'不能重寫'name'和'name_ =',但它可能會覆蓋'_name'。而你的其他類不能訪問'_name'。相反,他們必須使用'name'和'name_ ='。 –

+0

你好, 我很抱歉,但我不明白如何覆蓋。 所有繼承自Element的類都不得重寫字段「name」,它們必須實現Element的字段:「name」。 對不起,我的英文翻譯 – user1826663