Có lẽ một chuyên gia về Scala với một cảm giác tốt về phong cách và sự thanh lịch có thể giúp tôi tìm ra một cách tốt hơn để cấu trúc mã sau đây, trong đó có một vấn đề khởi tạo "đẩy ra".Thiết kế Modale Scala: làm cách nào để tránh một bản thiết kế "push-out" của nhà xây dựng?
Chúng tôi bắt đầu với một lớp cơ sở đơn giản:
class Foo(val i: Int, val d: Double, val s: String) {
def add(f: Foo) = new Foo(i + f.i, d + f.d, s + f.s)
override def toString = "Foo(%d,%f,%s)".format(i,d,s)
}
Đối với mục đích loại kiểm tra trong một ứng dụng phức tạp, tôi yêu cầu một sub-class mà không cần bất kỳ nhà nước bổ sung:
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
Khi đứng , khi tôi thêm hai Thanh, tôi chỉ lấy lại một Foo:
val x = new Bar(1,2.3,"x")
val y = new Bar(4,5.6,"y")
val xy = x.add(y)
với câu trả lời sau trong REPL:
x : Bar = Bar(1,2.300000,x)
y : Bar = Bar(4,5.600000,y)
xy : Foo = Foo(5,7.900000,xy)
Làm cách nào để có hai Thanh để cùng nhau tạo thành một Thanh khác (chứ không phải là Foo) một cách thanh lịch mà không phải sao chép và dán phương thức thêm của Foo như dưới đây?
class Bar(i: Int, d: Double, s: String) extends Foo(i,d,s) {
// ugly copy-and-paste from Foo:
def add(b: Bar) = new Bar(i + b.i, d + b.d, s + b.s)
override def toString = "Bar(%d,%f,%s)".format(i,d,s)
}
Tôi có nhiều thanh như vậy (tất cả bản sao của Foo, nhưng rất quan trọng để kiểm tra loại), giải pháp cắt và dán sẽ trả cổ tức.
Cảm ơn!
Tôi thích ý tưởng "tham số như nhãn". Cảm ơn bạn! –