ConstructorOtrzymałem proste pytanie na temat konstruktorów c#.

Czasem gdy mamy wiele konstruktorów logika w nich się powtarza. Wtedy warto zastosować mechanizm zwany “Constructor chaining”.

Mamy więc klasę z wieloma konstruktorami

public class Game
{
    public string Name { get; set; }
    public string Publisher { get; set; }

    public int AgeRestriction { get; set; }

    public DateTime Date { get; set; }

    public int Id { get; set; }

    public Game()
    {
        Id = -1;
    }

    public Game(int id)
    {
        Id = id;
    }

    public Game(string name,string pub)
    {
        Name = name;
        Publisher = pub;
        Id = -1;
    }

    public Game( string name, string pub,int agerestriction) 
    {
        AgeRestriction = agerestriction;
        Name = name;
        Publisher = pub;
        Id = -1;
    }

    public Game(string name, string pub, int agerestriction, DateTime date)
    {
        AgeRestriction = agerestriction;
        Name = name;
        Publisher = pub;
        Date = date;
        Id = -1;
    }
}

Jak widać w wielu miejscach kod się powtarza. Skrócimy więc go:

public class Game
{
    public string Name { get; set; }
    public string Publisher { get; set; }

    public int AgeRestriction { get; set; }

    public DateTime Date { get; set; }

    public int Id { get; set; }

    public Game() : this(-1)
    {}

    public Game(int id)
    {
        Id = id;
    }

    public Game(string name,string pub) : this()
    {
        Name = name;
        Publisher = pub;
    }

    public Game( string name, string pub,int agerestriction) 
        :this(name,pub)
    {
        AgeRestriction = agerestriction;
    }

    public Game(string name, string pub, int agerestriction, DateTime date)
        : this(name,pub,agerestriction)
    {
        Date = date;
    }
}

Tą samą technikę możesz zastosować w klasach dziedziczących trzeba tylko użyć słowa kluczowego “base”.

Czasami nawet jest to wymagane. Przykładowo gdy klasa bazowa nie ma konstruktora bez parametrowego.

public class Product
{
    public int Id { get; set; }
    public Product(int id)
    {
        Id = id;
    }
}

public class Game : Product
{
    public Game(int id) : base(id)
    {
        Id = id;
    }

    public Game() : this(-1)
    {}

    public Game(string name, string pub) : this()
    {
        Name = name;
        Publisher = pub;
    }

    public Game(string name, string pub, int agerestriction)
        : this(name, pub)
    {
        AgeRestriction = agerestriction;
    }

    public Game(string name, string pub, int agerestriction, DateTime date)
        : this(name, pub, agerestriction)
    {
        Date = date;
    }

    public string Name { get; set; }
    public string Publisher { get; set; }

    public int AgeRestriction { get; set; }

    public DateTime Date { get; set; }
}

Pamiętaj także, że nie zawsze musisz pisać takich łańcuchy konstruktorów. Od czego są “object initializers”

Game G = new Game() {Date = DateTime.Now};