مرکزی مواد پر جائیں
ماڈیول 6 · سبق 1 از 5کورس میں 26/50~12 min
ماڈیول اسباق (1/5)

انٹرفیس: رویے کی وضاحت

Go میں ایک انٹرفیس طریقہ دستخطوں کا ایک مجموعہ ہے۔ ایک قدر انٹرفیس کو لاگو کرتا ہے اگر اس میں تمام طریقے ہیں — نہیں۔ implements، کوئی extends، کوئی واضح رجسٹریشن نہیں۔ یہ ہے ماڈل جسے اکثر "سٹرکچرل ٹائپنگ" یا "سٹیٹک ڈک ٹائپنگ" کہا جاتا ہے: کمپائلر کمپائل کے وقت مطابقت کی جانچ کرتا ہے، لیکن اس کی بنیاد پر شکل، اعلانات پر نہیں۔

انٹرفیس کا اعلان کرنا

Go
type Greeter interface {
    Greet() string
}

کنونشن: سنگل میتھڈ انٹرفیس کے لیے -er پر ختم ہونے والے نام (Reader, Writer, Stringer, Closer)۔ چھوٹے انٹرفیس (1–2 طریقے) محاورہ ہیں: معیاری لائبریری بھری ہوئی ہے۔ چھوٹے انٹرفیس جو ایک ساتھ کمپوز کرتے ہیں (io.ReadWriter, io.ReadCloser، …)۔

مکمل نفاذ

Go
type Person struct{ Name string }

func (p Person) Greet() string {
    return "ciao " + p.Name
}

// Person satisfies Greeter because it has the required method.
var s Greeter = Person{Name: "Ada"}
fmt.Println(s.Greet())

کوئی کلیدی لفظ نہیں۔ اگر قسم کے طریقے ہیں، تو اسے تفویض کیا جا سکتا ہے۔ اس انٹرفیس کی قسم کا ایک متغیر۔ بس۔

انٹرفیس کے ذریعے پولیمورفزم

Go
type Robot struct{ ID string }
func (r Robot) Greet() string { return "bip " + r.ID }

func greet(s Greeter) {
    fmt.Println(s.Greet())
}

greet(Person{Name: "Ada"})
greet(Robot{ID: "R2"})

greet کسی بھی قسم کو قبول کرتا ہے جو Greeter کو مطمئن کرتا ہے۔ یہ جانے کا راستہ ہے۔ پولیمورفزم کرنے کا: کوئی درجہ بندی نہیں، صرف صلاحیت۔

خالی انٹرفیس

Go
var x interface{} = 42
var y any = "ciao"   // any is the built-in alias of interface{}

interface{} (یا any چونکہ Go 1.18) کو کسی طریقے کی ضرورت نہیں ہے، لہذا کوئی بھی قدر اسے مطمئن کرتی ہے۔ عام کنٹینرز کے لیے مفید ہے، لیکن نکالنے کے لیے ٹھوس قدر جس کے لیے آپ کو قسم کے دعوے یا ٹائپ سوئچ کی ضرورت ہے (اگلے اسباق)۔

طریقہ سیٹ: ویلیو بمقابلہ پوائنٹر وصول کنندہ (پیش نظارہ)

ماڈیول 5 سے یاد کریں:

  • ویلیو وصول کنندہ والے طریقے T اور *T دونوں کے طریقہ کار میں ہیں۔
  • پوائنٹر وصول کنندہ والے طریقے صرف *T کے طریقہ کار میں ہیں۔

عملی نتیجہ:

Go
type Counter struct{ N int }
func (c *Counter) Inc() { c.N++ }

type Incrementer interface { Inc() }

var i Incrementer = &Counter{}   // OK: *Counter has Inc()
// var j Incrementer = Counter{} // ERROR: Counter (value) does NOT

جب کسی طریقہ میں پوائنٹر وصول کرنے والا ہوتا ہے، تو آپ کو ایک پوائنٹر تفویض کرنا چاہیے۔ انٹرفیس متغیر.

اسے آزمائیں

ورزش#go.m6.l1.e1
کوششیں: 0لوڈ ہو رہا ہے…

ایک ہی طریقہ Greet() سٹرنگ کے ساتھ ایک انٹرفیس Greeter کی وضاحت کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

نحو: `ٹائپ نام انٹرفیس { طریقہ (آرگس) واپسی }`۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m6.l1.e2
کوششیں: 0لوڈ ہو رہا ہے…

فیلڈ آئی ڈی سٹرنگ کے ساتھ ایک نئی قسم کے روبوٹ پر گریٹر کو نافذ کریں۔ طریقہ 'bip' + ID واپس کرتا ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

کوئی `عملیات` نہیں: صرف صحیح دستخط کے ساتھ طریقہ کی وضاحت کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m6.l1.e3
تیار

آپ یہ کیسے اعلان کرتے ہیں کہ قسم P گریٹر انٹرفیس کو نافذ کرتی ہے؟

Go
type P struct{}
// ?
جواب کے اختیارات

Recap

  • انٹرفیس = طریقہ کار کے دستخطوں کا سیٹ؛ نہیں implements
  • مضمون نفاذ: صرف صحیح دستخط والے طریقے رکھیں۔
  • محاوراتی: چھوٹے انٹرفیس (1–2 طریقے)، -er میں نام۔
  • interface{} / any: کسی بھی قدر کو قبول کرتا ہے، قسم کی حفاظت کھو دیتا ہے۔
  • طریقہ سیٹ: پوائنٹر وصول کنندہ → صرف *T انٹرفیس کو مطمئن کرتا ہے۔
  • گو پولیمورفزم: انٹرفیس ٹائپ پیرامیٹرز، کوئی درجہ بندی نہیں۔