Ich denke, dass Sie für ein Merkmal freuen:
trait Nameable {
def name: String
def surname: String
}
case class Person(name: String, surname: String, age: Option[Int]) extends Nameable
implicit def arbitraryToPerson(variable: Nameable): Person = Person(variable.name, variable.surname, None)
Sie eines Merkmals wie eine Schnittstelle denken. Charakteristisch für Scala-Merkmale ist, dass sie auch Implementierungen ihrer Methoden akzeptieren.
Klassen, die diese Eigenschaft erweitern, müssen die Methoden name
und surname
implementieren. In diesem Fall wäre der einzige gültige benennbare Parameter eine Person. Mehr Klassen zu haben, die das Merkmal erweitern, würde eine Art von Polymorphismus erlauben, was dies implizit tatsächlich nützlich macht.
EDIT Von Ihrem Kommentar und negativ, nur um darauf hinzuweisen, dass Sie Ihre Merkmale aufrufen können, wie Sie möchten. In Ihrem Fall könnte etwas wie Nameable
funktionieren. Es bedeutet nicht, dass es eine Hierarchie gibt, sondern dass Ihr Objekt bestimmte Bedingungen erfüllt, wie die Implementierung dieser Methoden. Klassen können mehr als ein Merkmal in Scala mit dem Schlüsselwort with
erweitern.
case class Dog(name: String, surname: String) extends Animal with Nameable
In diesem Fall würde Ihr Hund ein Tier sein, aber man kann durch die Verlängerung der Eigenschaft, die Umsetzung der Umbenennbar Methoden erzwingen.
Nicht wirklich, ich mag keine Klassenhierarchie haben. Ich habe ein beliebiges Objekt, das eine Superklasse der Person sein könnte oder könnte. z.B. Die Konvertierung würde auf ALL-Objekten funktionieren, die Felder unabhängig von ihrer Vererbung haben. –
@ ArtursVacans Dann müssen Sie den Typ Mensch für welchen Typ auch immer ändern, den Sie als Quelle der Daten verwenden möchten, um eine Person zu erstellen. Von diesem Moment an können Sie diesen Typ an einen Parameter vom Typ Person senden. – Khanser
Ich gehe davon aus, dass das funktionieren würde, aber ich möchte meine Zieleinheit nicht mit zusätzlichen Eigenschaften verpesten:/ –