Sobes.tech
Junior

Mis on partide tüübi määramine?

sobes.tech AI

Vastus AI-lt

Antud tüüpi (duck typing) on dünaamilise tüübi määramise stiil, kus objekti või muutuja tüüp määratakse mitte selle otsese pärimise või liidese realiseerimise põhjal, vaid selle põhjal, kas tal on teatud meetodid või omadused. Kui objekt "käitub nagu part ja krooksub nagu part", siis loetakse, et see on part.

Go keeles realiseeritakse antud tüüpi mitteavalike liideste kaudu. Struktuur või muu andmetüüp ei pea otseselt märkima, et ta realiseerib teatud liidest. Piisab, kui andmetüüp realiseerib kõik liidese määratletud meetodid.

Näide:

package main

import "fmt"

// Määratleme liidese Speaker
type Speaker interface {
	Speak()
}

// Määratleme struktuuri Dog
type Dog struct{}

// Dog realiseerib meetodi Speak()
func (d Dog) Speak() {
	fmt.Println("Gav!")
}

// Määratleme struktuuri Cat
type Cat struct{}

// Cat realiseerib meetodi Speak()
func (c Cat) Speak() {
	fmt.Println("Miau!")
}

// Funktsioon, mis võtab argumendiks Speaker tüüpi
func MakeItSpeak(s Speaker) {
	s.Speak()
}

func main() {
	d := Dog{}
	c := Cat{}

	// Mõlemad objektid, Dog ja Cat, saab edastada funktsioonile MakeItSpeak,
	// kuna mõlemad mitteavalikult realiseerivad Speaker.
	MakeItSpeak(d)
	MakeItSpeak(c)
}

Selles näites ei näidata otseselt, et Dog ja Cat realiseerivad Speaker. Kuid kuna neil mõlemal on meetod Speak(), mis vastab Speaker liidese signatuurile, saab neid kasutada seal, kus oodatakse Speaker tüüpi.

Go keele antud tüüpi (duck typing) eelised:

  • Paindlikkus: võimaldab hõlpsasti luua modulaarseid ja laiendatavaid süsteeme.
  • Range hierarhia: pärandamine või liideste otsene realiseerimine ei ole vajalik.
  • Olemasolevate tüüpide lihtne kasutamine: iga tüüp, millel on vajalikud meetodid, võib vastata liidesele, isegi kui see ei olnud selleks algselt mõeldud.