Sicherstellen, dass eingebettete Strukturen die Schnittstelle implementieren, ohne Mehrdeutigkeiten einzuführen

Ich versuche, meine Codebasis zu bereinigen, indem ich die Schnittstellen besser definiere und eingebettete Strukturen verwende, um die Funktionalität wiederzuverwenden. In meinem Fall habe ich viele Entitätstypen, die mit verschiedenen Objekten verknüpft werden können. Ich möchte Schnittstellen definieren, die die Anforderungen und Strukturen erfassen, die die Schnittstellen implementieren, die dann in die Entitäten eingebettet werden können.

// All entities implement this interface
type Entity interface {
  Identifier()
  Type()
}

// Interface for entities that can link Foos
type FooLinker interface {
  LinkFoo()
}

type FooLinkerEntity struct {
  Foo []*Foo
}

func (f *FooLinkerEntity) LinkFoo() {
  // Issue: Need to access Identifier() and Type() here
  // but FooLinkerEntity doesn't implement Entity
}

// Interface for entities that can link Bars
type BarLinker interface {
  LinkBar()
}

type BarLinkerEntity struct {
  Bar []*Bar
}

func (b *BarLinkerEntity) LinkBar() {
  // Issues: Need to access Identifier() and Type() here
  // but BarLinkerEntity doesn't implement Entity
}

So war mein erster Gedanke, dass FooLinkerEntity und BarLinkerEntity nur die Entity-Schnittstelle implementieren.

// Implementation of Entity interface
type EntityModel struct {
    Id string
    Object string
}

func (e *EntityModel) Identifier() { return e.Id }
func (e *EntityModel) Type() { return e.Type }

type FooLinkerEntity struct {
  EntityModel
  Foo []*Foo
}

type BarLinkerEntity struct {
  EntityModel
  Bar []*Bar
}

Dies führt jedoch zu einem Mehrdeutigkeitsfehler für alle Typen, die sowohl Foos als auch Bars verknüpfen können.

// Baz.Identifier() is ambiguous between EntityModel, FooLinkerEntity,
// and BarLinkerEntity.
type Baz struct {
    EntityModel
    FooLinkerEntity
    BarLinkerEntity
}

Was ist der richtige Weg, um diese Art von Code zu strukturieren? Mache ich nur eine Typbehauptung inLinkFoo() undLinkBar() zu erreichenIdentifier() undType()? Gibt es eine Möglichkeit, diese Prüfung zur Kompilierungszeit anstelle der Laufzeit zu erhalten?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage