تسلسل استدعاء البُناة باستخدام this
أعيدوا استخدام التهيئة عبر البُناة
تسلسل استدعاء البُناة باستخدام this درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.
لماذا نُسلسل المُنشئات؟
عندما تشترك عدة مُنشئات في منطق الإعداد نفسه، يمكنكم تسلسلها بحيث يستدعي أحدها الآخر. يؤدي ذلك إلى تجنب تكرار الشيفرة والحفاظ على تهيئة الكائن في مكان واحد.
using System;
class Box
{
public int Width;
public int Height;
public Box(int width, int height)
{
Width = width;
Height = height;
}
public Box() : this(1, 1) { }
}
class Program
{
static void Main()
{
var def = new Box();
Console.WriteLine(def.Width + "x" + def.Height);
}
}صيغة : this(...)
يستخدم التسلسل : this(args) بعد توقيع المُنشئ. يُنفَّذ المُنشئ المستهدف أولًا، ثم يُنفَّذ جسم المُنشئ الحالي.
using System;
class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
Console.WriteLine("Full constructor ran");
}
public Person(string name) : this(name, 0)
{
Console.WriteLine("Name-only constructor ran");
}
}
class Program
{
static void Main()
{
var p = new Person("Sam");
Console.WriteLine(p.Name + ", " + p.Age);
}
}ترتيب التنفيذ
يُنفَّذ المُنشئ المتسلسل قبل جسم المُنشئ المستدعي. ويضمن ذلك تنفيذ الإعداد الأساسي أولًا.
using System;
class Step
{
public Step(int n)
{
Console.WriteLine("Init with " + n);
}
public Step() : this(0)
{
Console.WriteLine("Then default body");
}
}
class Program
{
static void Main()
{
var s = new Step();
}
}مصدر واحد للحقيقة
وجّهوا جميع المُنشئات إلى مُنشئ «أساسي» واحد يحتوي على المنطق الفعلي. أما المُنشئات الأخرى، فما عليها سوى توفير القيم الافتراضية وتسلسل الاستدعاء إليه.
using System;
class Connection
{
public string Host;
public int Port;
public Connection(string host, int port)
{
Host = host;
Port = port;
}
public Connection(string host) : this(host, 8080) { }
public Connection() : this("localhost", 8080) { }
}
class Program
{
static void Main()
{
var c = new Connection("example.com");
Console.WriteLine(c.Host + ":" + c.Port);
}
}التسلسل مع القيم الافتراضية
يُعد التسلسل طريقة واضحة للتعبير عن القيم الافتراضية المتدرجة: إذ يملأ كل مُنشئ أقصر قيمة افتراضية إضافية، ثم يفوّض التنفيذ إلى المُنشئ الآخر.
using System;
class Coffee
{
public string Size;
public bool Milk;
public int Sugar;
public Coffee(string size, bool milk, int sugar)
{
Size = size;
Milk = milk;
Sugar = sugar;
}
public Coffee(string size, bool milk) : this(size, milk, 0) { }
public Coffee(string size) : this(size, false) { }
}
class Program
{
static void Main()
{
var c = new Coffee("large");
Console.WriteLine(c.Size + ", milk=" + c.Milk + ", sugar=" + c.Sugar);
}
}التحقق في المُنشئ المستهدف
بما أن كل مُنشئ يمر عبر المُنشئ الأساسي، فإن كتابة التحقق فيه تحمي جميع مسارات إنشاء الكائنات.
using System;
class Rect
{
public int W;
public int H;
public Rect(int w, int h)
{
if (w <= 0 || h <= 0)
throw new ArgumentException("Dimensions must be positive");
W = w;
H = h;
}
public Rect(int side) : this(side, side) { }
}
class Program
{
static void Main()
{
var square = new Rect(5);
Console.WriteLine(square.W + "x" + square.H);
}
}التسلسل مقابل المعلمات الافتراضية
يمكن للمعلمات الافتراضية أن تحل محل العديد من أشكال التحميل الزائد، لكن التسلسل يكون أوضح عندما يحتاج كل مُنشئ إلى منطق مختلف قليلًا في جسمه.
using System;
class Logger
{
public string Prefix;
public bool Verbose;
public Logger(string prefix, bool verbose)
{
Prefix = prefix;
Verbose = verbose;
}
public Logger(string prefix) : this(prefix, false)
{
Console.WriteLine("Created quiet logger");
}
}
class Program
{
static void Main()
{
var log = new Logger("APP");
Console.WriteLine(log.Prefix + " verbose=" + log.Verbose);
}
}شيوع الأجسام الفارغة
غالبًا ما يكون جسم مُنشئ التسلسل فارغًا { }، لأن كل العمل يحدث في المُنشئ المستهدف.
using System;
class Vector
{
public double X, Y, Z;
public Vector(double x, double y, double z)
{
X = x; Y = y; Z = z;
}
public Vector(double v) : this(v, v, v) { }
}
class Program
{
static void Main()
{
var v = new Vector(2);
Console.WriteLine(v.X + "," + v.Y + "," + v.Z);
}
}تجنب الحلقات
يجب ألا تُسلسل المُنشئات بعضها إلى بعض في حلقة (يستدعي A B، ويستدعي B A). يرفض المترجم سلاسل : this(...) الدائرية.
using System;
class Safe
{
public int A, B;
public Safe(int a, int b)
{
A = a;
B = b;
}
public Safe(int a) : this(a, 0) { } // chains one direction only
}
class Program
{
static void Main()
{
var s = new Safe(7);
Console.WriteLine(s.A + ", " + s.B);
}
}الدمج مع this.field
يمكنكم إجراء التسلسل، مع الاستمرار في استخدام this. داخل الجسم لأي إعداد إضافي بعد عودة المُنشئ المستهدف.
using System;
class Account
{
public string Owner;
public decimal Balance;
public bool Active;
public Account(string owner, decimal balance)
{
this.Owner = owner;
this.Balance = balance;
}
public Account(string owner) : this(owner, 0m)
{
this.Active = true;
}
}
class Program
{
static void Main()
{
var a = new Account("Rin");
Console.WriteLine(a.Owner + " active=" + a.Active);
}
}تجميع المفاهيم
يحافظ التسلسل على مبدأ DRY في الفئة: يتحقق مُنشئ واحد من القيم ويُسنِدها، بينما توفر المُنشئات الأخرى اختصارات ملائمة.
using System;
class Pizza
{
public string Size;
public int Toppings;
public Pizza(string size, int toppings)
{
if (toppings < 0) throw new ArgumentException("toppings");
Size = size;
Toppings = toppings;
}
public Pizza(string size) : this(size, 0) { }
public Pizza() : this("medium") { }
}
class Program
{
static void Main()
{
var p = new Pizza();
Console.WriteLine(p.Size + " with " + p.Toppings + " toppings");
}
}تحقق سريع
اختبروا مدى فهمكم لتسلسل المُنشئات.
مراجعة
يستخدم تسلسل المُنشئات الصيغة : this(args) لاستدعاء مُنشئ آخر في الفئة نفسها. يُنفَّذ المُنشئ المستهدف أولًا، ثم يُنفَّذ الجسم الحالي. وجّهوا كل مُنشئ عبر مُنشئ أساسي واحد لتجميع التحقق في مكان واحد وتجنب تكرار الإعداد. ولا يُسمح بالسلاسل الدائرية.
using System;
class Demo
{
public int X, Y;
public Demo(int x, int y) { X = x; Y = y; }
public Demo(int both) : this(both, both) { }
}
class Program
{
static void Main()
{
var d = new Demo(4);
Console.WriteLine(d.X + "," + d.Y);
}
}الأسئلة الشائعة
هل درس «تسلسل استدعاء البُناة باستخدام this» مجاني؟
نعم — نص درس «تسلسل استدعاء البُناة باستخدام this» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.
ماذا ستتعلم في «تسلسل استدعاء البُناة باستخدام this»؟
أعيدوا استخدام التهيئة عبر البُناة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تسلسل استدعاء البُناة باستخدام this»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف البُناة
- تسلسل استدعاء البُناة باستخدام this
- مهيئات الكائنات والمجموعات
- البُناة الساكنة