Keyword สำคัญ 2 ตัว
this() - เรียก Constructor อีกตัวใน Class เดียวกัน (Constructor Chaining)
base() - เรียก Constructor ของ Base Class (Parent)
Syntax
// เรียก Base Constructor
public ChildClass(parameters) : base(baseParameters)
{
// Child Constructor Body
}
// เรียก Constructor อีกตัวใน Class เดียว
public ChildClass(parameters) : this(otherParameters)
{
// Body
}
ตัวอย่าง: เรียก Base Constructor
class DemoBase
{
public DemoBase(int first, int second, int third)
{
Console.WriteLine("Base Class Constructor");
Console.WriteLine($"{first} {second} {third}");
}
}
class Demo : DemoBase
{
// ส่ง Parameter ผ่านไปให้ Base
public Demo(int first, int second, int third) : base(first, second, third)
{
Console.WriteLine("Derived Class Constructor");
Console.WriteLine($"{first} {second} {third}");
}
}
class Program
{
static void Main()
{
Demo obj = new Demo(1, 2, 3);
Console.ReadLine();
}
}
Output
Base Class Constructor
1 2 3
Derived Class Constructor
1 2 3
ตัวอย่าง: Constructor Chaining (this) + Base
class Demo
{
// Parameter-less
public Demo()
{
Console.WriteLine("Parameter-less constructor");
}
// 2 Parameters - เรียก Parameter-less ก่อน
public Demo(int a, int b) : this()
{
Console.WriteLine($"2 params: {a} {b}");
}
// 3 Parameters - เรียก 2 Parameters
public Demo(int a, int b, int c) : this(a, b)
{
Console.WriteLine($"3 params: {a} {b} {c}");
}
}
class Program
{
static void Main()
{
new Demo(1, 2, 3);
Console.ReadLine();
}
}
Output
Parameter-less constructor
2 params: 1 2
3 params: 1 2 3
กฎสำคัญ
- Base Constructor เรียกก่อนเสมอ ก่อน Body ของ Derived Constructor
- ถ้าไม่ระบุ
: base() จะเรียก Parameter-less Constructor ของ Base อัตโนมัติ
- ถ้า Base ไม่มี Parameter-less Constructor → บังคับ ต้องระบุ
: base(...)
this() และ base() ใช้ร่วมกันไม่ได้ใน Constructor เดียวกัน (เลือกอย่างใดอย่างหนึ่ง)
- Execution Order: Base Constructor → this() Chain → Derived Body
Use Case จริง
public class Entity
{
public Guid Id { get; }
public DateTime CreatedAt { get; }
protected Entity() : this(Guid.NewGuid(), DateTime.UtcNow) { }
protected Entity(Guid id, DateTime createdAt)
{
Id = id;
CreatedAt = createdAt;
}
}
public class User : Entity
{
public string Name { get; }
public User(string name) : base() // เรียก Base Protected Constructor
{
Name = name;
}
// สำหรับ Deserialization/Testing
public User(Guid id, string name, DateTime createdAt) : base(id, createdAt)
{
Name = name;
}
}