Interfejsat

Interfejsi është një set metodash. Një interfejs përshkruan sjelljen (behaviour) e një tipi.

Nëse interfejsi nuk e definon asnjë metodë, atëherë ai është interfejs i zbrazët. Të gjitha tipet e implementojnë interfejsin e zbrazët.

Në Go nuk kemi deklarim eksplicit të interfejsit me implements, siç e kemi në gjuhët tjera. Cilido tip i të dhënave (p.sh. strukt), që është pranues (receiver) i metodave të definuara në një interfejs, në mënyrë implicite e implementon atë interfejs.

package main

import (
    "fmt"
    "math"
)

type FormaGjeometrike interface {
    Siperfaqja() float32
}

type Katerkendeshi struct {
    Gjeresia float32
    Gjatesia float32
}

func (k Katerkendeshi) Siperfaqja() float32 {
    return k.Gjeresia * k.Gjatesia
}

func (r Rrethi) Siperfaqja() float32 {
    return math.Pi * r.Rrezja * r.Rrezja
}

func Matja(fgj FormaGjeometrike) float32 {
    return fgj.Siperfaqja()
}

type Rrethi struct {
    Rrezja float32
}

func main() {
    r := Rrethi{5}
    fmt.Println("Siperfaqja e rrethit: ")
    fmt.Println(Matja(r))

    k := Katerkendeshi{5, 2}
    fmt.Println("Siperfaqja e katerkendeshit: ")
    fmt.Println(Matja(k))
}

https://play.golang.org/p/OMrS3VIfpHc

Rezultati:

Siperfaqja e rrethit: 
78.53982
Siperfaqja e katerkendeshit: 
10
package main

import (
    "fmt"
)

type Person interface {
    Pershendetje() string
}

type Student struct {
    Emri         string
    Mbiemri      string
    Mosha        int
    NotaMesatare float32
}

type Punetor struct {
    Emri    string
    Mbiemri string
    Mosha   int
    Paga    float32
}

func (st Student) Pershendetje() string {
    return "Mirëmëngjes, " + st.Emri
}

func (pn Punetor) Pershendetje() string {
    return "Punë të mbarë, " + pn.Emri
}

// Pranon tipet Student dhe Punetor,
// sepse te dyja e implementojne interfejsin Person
func TeDhenat(p Person) string {
    rez := ""
    switch p.(type) {
    case Student:
        rez = p.(Student).Emri + " " + p.(Student).Mbiemri + ", student, nota mesatare " + fmt.Sprintf("%.2f", p.(Student).NotaMesatare)
    case Punetor:
        rez = p.(Punetor).Emri + " " + p.(Punetor).Mbiemri + ", punëtor, paga " + fmt.Sprintf("%.2f", p.(Punetor).Paga) + " EURO"
    }
    return rez
}

func main() {
    // STUDENTI
    var a = Student{
        Emri:         "Taulant",
        Mbiemri:      "Berisha",
        Mosha:        19,
        NotaMesatare: 8.9,
    }

    // PUNËTORI
    fmt.Println(a.Pershendetje())
    fmt.Println(TeDhenat(a))

    var b = Punetor{
        Emri:    "Durim",
        Mbiemri: "Krasniqi",
        Mosha:   28,
        Paga:    1000,
    }

    fmt.Println(b.Pershendetje())
    fmt.Println(TeDhenat(b))
}

https://play.golang.org/p/XOdPtP4pYU4

Rezultati:

Mirëmëngjes, Taulant
Taulant Berisha, student, nota mesatare 8.90
Punë të mbarë, Durim
Durim Krasniqi, punëtor, paga 1000.00 EURO

Variablat a dhe b mund t’i deklarojmë të tipit Person, me çka a bëhet variabël e tipit Student që implementon interfejsin Person, ndërsa b bëhet variabël e tipit Punetor që implementon po atë interfejs. Mirëpo, ky nuk është implementim eksplicit i interfejsit, sepse interfejsi konsiderohet i implementuar nëse një tip (në këtë rast struct) posedon metodat që janë listuar në interfejs.

Nëse tipi, në këtë rast strukti, nuk i posedon TË GJITHA metodat e cekura në interfejs dhe me po të njëjtat nënshkrime të funksioneve (function signature), pra numrin dhe tipin e argumenteve dhe të rezultateve kthyese, atëherë nuk është duke e implementuar atë interfejs.

// STUDENTI
    var a Person = Student{
        Emri:         "Taulant",
        Mbiemri:      "Berisha",
        Mosha:        19,
        NotaMesatare: 8.9,
    }

    // PUNËTORI
    var b Person = Punetor{
        Emri:    "Durim",
        Mbiemri: "Krasniqi",
        Mosha:   28,
        Paga:    1000,
    }
All Rights Reserved Theme by 404 THEME.