2016-03-18 2 views
0

Ich möchte eine ReverseSort Methode auf sort.IntSlice erstellen. Also habe ich einen benutzerdefinierten Typ von MySlice erstellt und eine Methode von ReverseSort hinzugefügt.Wiederverwendung der Methoden des Basistyps in dem abgeleiteten benutzerdefinierten Typ in Golang

package main 

import (
    "fmt" 
    "sort" 
) 

type MySlice sort.IntSlice 

func (ms MySlice) ReverseSort() { 
    sort.Sort(sort.Reverse(ms)) 
} 
func main() { 
    t2 := MySlice{5, 4, 3, 1} 
    t2.ReverseSort() 
    fmt.Println(t2) 
} 

Aber auf dieses Programm Fehler ausgeführt wird, dass

cannot use ms (type MySlice) as type sort.Interface in argument to sort.Reverse: 
     MySlice does not implement sort.Interface (missing Len method) 

Gibt es eine Möglichkeit, ich kann dies meine eigene Len, für meine benutzerdefinierten Typ Swap und Less Methoden ohne die Erstellung implementieren, mit denen gezeigt.

Antwort

2

Sie könnten sort.IntSlice in Ihrem benutzerdefinierten Typ einbetten:

type MySlice struct { 
    sort.IntSlice 
} 

func (ms MySlice) ReverseSort() { 
    sort.Sort(sort.Reverse(ms)) 
} 

func main() { 
    t2 := MySlice{sort.IntSlice{5, 4, 3, 1}} 
    t2.ReverseSort() 
    fmt.Println(t2) 
} 

(On the Go Playgroud.)

natürlich, dass Objekte erschwert zu konstruieren.


A post on golang-nuts bespricht dies:

Sie "neue Methoden nicht auf nicht-lokalen Typ definieren kann [s]", von Entwurf.

Die beste Vorgehensweise besteht darin, den nicht lokalen Typ in Ihren eigenen lokalen Typ einzubetten und ihn zu erweitern. Typ-Aliasing (Typ MyFoo Foo) erstellt einen Typ, der (mehr oder weniger) vollständig vom Original unterscheidet. Ich bin nicht bewusst, eine einfache/Best-Practice-Art zu verwenden Typ Behauptungen, um das zu umgehen.

  • Peter Bourgon

Und:

Ein Verfahren des Typs sind in dem Paket, das es definiert.

Dies ist eine logische Kohärenz. Es ist eine Zusammenstellung Tugend. Es wird als ein wichtiger Vorteil für groß angelegte Wartung und mehrere Personen Entwicklungsprojekte gesehen.

Die Leistung, die Sie sprechen, ist nicht verloren, obwohl, weil Sie die Basistyp in einer neuen Art, wie oben beschrieben einbetten können und fügen Sie, was Sie es, in der Art der funktionellen wollen „ist ein“, dass Sie suchen, mit der einzigen Vorbehalt, dass Ihr neuer Typ muss einen neuen Namen haben, und alle seine Felder und Methoden müssen in seinem neuen Paket sein.

  • Michael Jones
Verwandte Themen