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};