假設我有一個這樣的案例類:
final case class Foo(a : String)
而我想有一個對Foo進行操作的方法。那么我可以這樣做:
final case class Foo(a : String){
def m 。Int = a.toInt
}
或者我可以做
。
object Foo{
def m (f : Foo) : Int = f.a.toInt
}
哪一個是最好的,或者每一個有什么優點和缺點?
uj5u.com熱心網友回復:
實際上你問的是x.m()和m(x)之間有什么區別。區別在于方法如何被解決。可以有不同的方法具有相同的名字m。
在這種情況下,x.m()方法是動態解決的,在運行時(重寫,后期系結)
class Foo {
def m()。Unit = println("Foo"/span>)
}
class Bar extends Foo{
override def m()。Unit = println("Bar")
}
val x: Foo =new Bar
x.m() // Bar
在這種情況下m(x)方法是靜態決議的,在編譯時(多載,早期系結)
class Foo
class Bar extends Foo
def m(x: Foo)。Unit = println("Foo"/span>)
def m(x: Bar)。Unit = println("Bar")
val x: Foo =new Bar
m(x) // Foo
類之一Foo,Bar可以是一個案例類。
uj5u.com熱心網友回復:
至少在概念上,一個類上的方法通常是對一個實體進行轉換的操作。
你可以這樣描繪一個物件的生命周期:
A -----> MyType -----> Mytype ----> B
| | |
構建轉換消除/消耗/折疊
習慣上,我們把構造器放在同伴物件中,把轉換放在類定義中。
在Scala 3中,我發現以下模式很有用:
在Scala 3中,我發現以下模式很有用。
- 將核心/小方法放在類本身 。
- 將大的/不常用的方法放在擴展部分 。
uj5u.com熱心網友回復:
這兩者是針對非常不同的使用情況,所以它們之間不應該有任何比較。
任何可以被認為是物件實體的 "行為 "并且是物件內在的東西,最好被實作為類/案例類方法。
這一點也與共享行為和繼承有關。使用同伴物件來管理繼承層次中的行為重寫將非常麻煩。對于任何沒有密封的東西來說,這幾乎是不可能的(而且非常難看),
這也將允許您輕松地重構您的代碼,以防您將來需要將這個case類抽象為一個trait。
任何感覺像物件實體之上的實用程式的東西都可以轉到同伴物件、工廠經理物件或一些利用物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332578.html
標籤:
