Предпочитаю использовать композицию вместо наследования
Сначала скажем, что у нас есть пользователь;
public interface IUser
{
public String Name { get; }
public String Surname { get; }
}
public class User : IUser
{
public User(String name, String surname)
{
this.Name = name;
this.Surname = surname;
}
public String Name { get; private set; }
public String Surname { get; private set; }
}
Теперь представьте, что по какой-то причине вам требуется адаптер для пользовательского класса, тогда у нас есть два подхода: наследование или составной;
//Inheritance
public class UserAdapter1 : User
{
public String CompleteName { get { return base.Name + " " + base.Surname } }
}
//Composition
public class UserAdapter2
{
private IUser user;
public UserAdapter2(IUser user)
{
this.user = user;
}
public String CompleteName { get { return this.user.Name + " " + this.user.Surname; } }
}
С вами все в порядке, но только если система не будет расти... Представьте, что вам нужно реализовать класс SuperUser, чтобы справиться с новым требованием;
public class SuperUser : IUser
{
public SuperUser(String name, String surname)
{
this.Name = name;
this.Surname = surname;
}
public String Name { get; private set; }
public String Surname { get; private set; }
public Int32 SupernessLevel { get { return this.Name.Length * 100; } }
}
Используя наследование, вы не сможете повторно использовать свой класс адаптера, испортив свой код (поскольку вам придется реализовать другой адаптер, наследующий от SuperUser, который будет делать то же самое, что и другой класс!!!). , Использование интерфейса полностью связано с расцеплением, это основная причина, по которой я с вероятностью 99% буду их использовать, конечно, если выбор за мной.
person
Renato Gama
schedule
29.03.2011