Golang et à l'héritage

Je veux fournir une base struct avec des méthodes dans ma bibliothèque qui peut être "étendu".

Les méthodes de cette base struct s'appuyer sur des méthodes de l'extension de struct.
Ce n'est pas possible directement en Aller, parce que struct méthodes n'ont accès qu'à leurs structures propres champs, pas de parent des structures.

Le point est d'avoir une fonctionnalité que je n'ai pas à le répéter dans chaque classe étendue.

Je suis venu avec ce modèle, qui fonctionne très bien,
mais c'est très compliquée en raison de sa structure cyclique.

Je n'ai jamais rien trouvé de tel dans les autres Aller au code.
Est ce de l'onu-aller?
Quelle approche différente pourrait-je prendre?

type MyInterface interface {
  SomeMethod(string)
  OtherMethod(string)
}

type Base struct{
  B MyInterface
}

func (b *Base) SomeMethod(x string) {
  b.B.OtherMethod(x)
}

type Extender struct {
  Base
}

func (b *Extender) OtherMethod(x string) {
  //Do something...
}

func NewExtender() *Extender { 
  e := Extender{}
  e.Base.B = &e
  return &e
}
  • Il est difficile de dire ce que vous faites à partir d'un exemple générique, mais ce n'est pas idiomatique Aller de code. En général, vous devez éviter de penser à des solutions via les classes et l'héritage tout à fait. Utiliser la composition à votre avantage, et n'oubliez pas que tout ne doit pas être une structure représentée par une interface, parfois les fonctions sont tout ce que vous devez.
  • Revoir la conception de votre solution. Go a pas d'héritage. Essayer de remodeler l'héritage avec ce Go offre plus probable sera un échec.
  • Ne comprends pas pourquoi vous êtes downvoted; vous demandé si c'était une approche appropriée, et si non, ce que vous pourriez faire pour l'améliorer. Au risque de ressembler à un drôle de type, je pense que votre question est bien. Avec cela étant dit, les deux commentateurs ci-dessus m'a frappé sur place.
  • Votre exemple de code me confond. Vous voulez probablement seulement pour définir les méthodes de " sur un seul type et de l'intégrer dans les types que vous voulez offrir à ces méthodes. Vous avez dit que vous avez eu un problème", car struct méthodes n'ont accès qu'à leurs structures propres champs", mais ce n'est pas vraiment vrai. Si vous incorporez un peu de type Base à l'intérieur de types A et B ensuite, ils peuvent accéder à un exporté champ pour Base à l'intérieur de leurs méthodes directement. Si Base a une méthode One et vous souhaitez la remplacer, vous pouvez la redéfinir dans A et toujours appeler A.Base.One() dans ce contexte, comme vous le feriez dans les langages à objets.
  • Je pense que vous avez besoin pour donner un exemple plus concret de ce que vous êtes en train de faire et pourquoi vous pensez que cette approche est nécessaire. Je vous ai donné un upvote pour neutraliser la note car je suis d'accord avec @william.taylor.09.
  • vous avez besoin struct intégration de la fonctionnalité de golang. cochez cette stackoverflow.com/questions/32125832/... voter si vous aimez la réponse.

InformationsquelleAutor theduke | 2015-08-24