簡體   English   中英

特質抽象方法

[英]Trait abstract method

如何使用需要存在的抽象方法定義特征,即使它可以具有不同的參數。 我只想確保擴展特征的類具有方法和相同的返回類型。 下面的示例(主要是說明性的)重載“添加”並給出需要定義“添加”的錯誤。 我該如何更改Trait中的方法聲明?

不幸的是,所有答案都不起作用。 我不確定我是否清楚,但我不希望定義/檢查的參數中有任何已定義的類型(任何,泛型,類型定義),因為它的類型和參數的數量可以改變,在我的返回的情況可能相同。 我只是想要檢查是否存在具有相同名稱和返回的方法而忽略參數。 “任何”不是替代品,因為它不是類型安全的,我想清楚地定義函數期望作為參數。

例:

trait X{
  def add: Boolean
}

class Y extends X {
  def add(i: Int, s: String) : Boolean = {...}
}

class W extends X {
  def add(i: Int, y: Int, w: Set[String]) : Boolean = {...}
}

對問題的解釋

在Scala中方法/函數def method(x: Int) : Boolean def method() : Boolean def method() : String是不同的。

它們具有相同的名稱,但是對於這種語義連接,Scala編譯器並不關心。 因此,您只能描述return type而不是函數的arguments ,因此您無法為編譯器提供足夠的信息來定義特征。 一個選項可以是給出最通用的類​​型Any和任意數量的參數。 僅通過基於函數名稱的匹配將是不可能的。 人們可以使用reflection ,但這很可能會導致很多昂貴的開銷。

以下是一些使用標准語言功能的可能解決方案

任何數量的參數任何類型的輸入

// any count and any type of input allowed, not much type safety
trait XAny{
  def add(args : Any*): Boolean
}

由type參數給出的任意數量的參數輸入類型

// any count and any type of input allowed, all input has to be a kind of A
trait XWithType[A]{
  def add(args : A*): Boolean
}

使用沒有限制的方法的替代解決方案

// any count and any type of input allowed, all input has to be a kind of A
trait XWithArbitraryMethod{
  def add(): Boolean // here add now would call the real implementation
}

這樣的事怎么樣?

trait X{
   def add(as: Int*): Boolean
} 

通過使用varargs,這適用於所有已命名的案例。 但是,如果要傳遞不同類型的參數,這將無效,但可以使用任意數量的Int參數。

看到這個問題

如果你想要超級動態並且不關心類型安全,你也可以將參數類型更改為Any* ,但是可能有更好的方法來做到這一點,不會犧牲類型安全性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM