ماڈیول اسباق (1/5)
انٹرفیس: رویے کی وضاحت
Go میں ایک انٹرفیس طریقہ دستخطوں کا ایک مجموعہ ہے۔ ایک قدر
انٹرفیس کو لاگو کرتا ہے اگر اس میں تمام طریقے ہیں — نہیں۔
implements، کوئی extends، کوئی واضح رجسٹریشن نہیں۔ یہ ہے
ماڈل جسے اکثر "سٹرکچرل ٹائپنگ" یا "سٹیٹک ڈک ٹائپنگ" کہا جاتا ہے:
کمپائلر کمپائل کے وقت مطابقت کی جانچ کرتا ہے، لیکن اس کی بنیاد پر
شکل، اعلانات پر نہیں۔
انٹرفیس کا اعلان کرنا
type Greeter interface {
Greet() string
}کنونشن: سنگل میتھڈ انٹرفیس کے لیے -er پر ختم ہونے والے نام
(Reader, Writer, Stringer, Closer)۔ چھوٹے انٹرفیس
(1–2 طریقے) محاورہ ہیں: معیاری لائبریری بھری ہوئی ہے۔
چھوٹے انٹرفیس جو ایک ساتھ کمپوز کرتے ہیں (io.ReadWriter,
io.ReadCloser، …)۔
مکمل نفاذ
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())کوئی کلیدی لفظ نہیں۔ اگر قسم کے طریقے ہیں، تو اسے تفویض کیا جا سکتا ہے۔ اس انٹرفیس کی قسم کا ایک متغیر۔ بس۔
انٹرفیس کے ذریعے پولیمورفزم
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 کو مطمئن کرتا ہے۔ یہ جانے کا راستہ ہے۔
پولیمورفزم کرنے کا: کوئی درجہ بندی نہیں، صرف صلاحیت۔
خالی انٹرفیس
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کے طریقہ کار میں ہیں۔
عملی نتیجہ:
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جب کسی طریقہ میں پوائنٹر وصول کرنے والا ہوتا ہے، تو آپ کو ایک پوائنٹر تفویض کرنا چاہیے۔ انٹرفیس متغیر.
اسے آزمائیں
ایک ہی طریقہ Greet() سٹرنگ کے ساتھ ایک انٹرفیس Greeter کی وضاحت کریں۔
اشارہ دکھائیں۔
نحو: `ٹائپ نام انٹرفیس { طریقہ (آرگس) واپسی }`۔
3 کوششوں کے بعد حل دستیاب ہے۔
فیلڈ آئی ڈی سٹرنگ کے ساتھ ایک نئی قسم کے روبوٹ پر گریٹر کو نافذ کریں۔ طریقہ 'bip' + ID واپس کرتا ہے۔
اشارہ دکھائیں۔
کوئی `عملیات` نہیں: صرف صحیح دستخط کے ساتھ طریقہ کی وضاحت کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
آپ یہ کیسے اعلان کرتے ہیں کہ قسم P گریٹر انٹرفیس کو نافذ کرتی ہے؟
type P struct{}
// ?Recap
- انٹرفیس = طریقہ کار کے دستخطوں کا سیٹ؛ نہیں
implements - مضمون نفاذ: صرف صحیح دستخط والے طریقے رکھیں۔
- محاوراتی: چھوٹے انٹرفیس (1–2 طریقے)،
-erمیں نام۔ interface{}/any: کسی بھی قدر کو قبول کرتا ہے، قسم کی حفاظت کھو دیتا ہے۔- طریقہ سیٹ: پوائنٹر وصول کنندہ → صرف
*Tانٹرفیس کو مطمئن کرتا ہے۔ - گو پولیمورفزم: انٹرفیس ٹائپ پیرامیٹرز، کوئی درجہ بندی نہیں۔