Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีเรียก Base Class Constructor จาก Child Class ใน C#

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

กฎสำคัญ

  1. Base Constructor เรียกก่อนเสมอ ก่อน Body ของ Derived Constructor
  2. ถ้าไม่ระบุ : base() จะเรียก Parameter-less Constructor ของ Base อัตโนมัติ
  3. ถ้า Base ไม่มี Parameter-less Constructor → บังคับ ต้องระบุ : base(...)
  4. this() และ base() ใช้ร่วมกันไม่ได้ใน Constructor เดียวกัน (เลือกอย่างใดอย่างหนึ่ง)
  5. 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;
    }
}