Генерация сквозного кода при «предпочтении композиции над наследованием»
проблема
Допустим, я пытаюсь смоделировать сотовый телефон как комбинацию обычного телефона и КПК. Это своего рода сценарий множественного наследования (сотовый телефонэто телефон, и этоэто PDA). Поскольку C # не поддерживает множественное наследование, это в значительной степени требует некоторой композиции. Плюс, допустим, у меня есть и другие причины отдать предпочтение композиции.
Я всегда удивляюсь: есть ли инструменты, которые автоматически сгенерируют весь неизбежный сквозной код?
Позвольте мне конкретизировать мой пример с помощью реального кода:
Интерфейсы:
public interface IPhone
{
public void MakeCall(int phoneNumber);
public void AnswerCall();
public void HangUp();
}
public interface IPda
{
public void SendEmail(string[] recipientList, string subject, string message);
public int LookUpContactPhoneNumber(string contactName);
public void SyncWithComputer();
}
Реализации:
public class Phone : IPhone
{
public void MakeCall(int phoneNumber) { // implementation }
public void AnswerCall() { // implementation }
public void HangUp() { // implementation }
}
public class Pda : IPda
{
public void SendEmail(string[] recipientList, string subject, string message) { // implementation }
public int LookUpContactPhoneNumber(string contactName) { // implementation }
public void SyncWithComputer() { // implementation }
}
Класс сотового телефона
public class CellPhone : IPhone, IPda
{
private IPhone _phone;
private IPda _pda;
public CellPhone(IPhone phone, IPda pda)
{
_phone = phone;
_pda = pda;
}
public void MakeCall(int phoneNumber)
{
_phone.MakeCall(phoneNumber);
}
public void AnswerCall()
{
_phone.AnswerCall();
}
public void HangUp()
{
_phone.HangUp();
}
public void SendEmail(string[] recipientList, string subject, string message)
{
_pda.SendEmail(recipientList, subject, message);
}
public int LookUpContactPhoneNumber(string contactName)
{
return _pda.LookUpContactPhoneNumber(contactName);
}
public void SyncWithComputer()
{
_pda.SyncWithComputer();
}
}
Написание класса CellPhone утомительно и подвержено ошибкам:
Все, что действительно делает этот класс, является проводником дляPhone
а такжеPda
классы. На самом деле нет никаких причин, по которым человеческие усилия должны требоваться, чтобы напечатать все эти сквозные утверждения (например,_phone.MakeCall(phoneNumber);
). Это просто экспонирование открытого интерфейса пары полей-членов.
Вопросов
Есть ли инструмент (желательно бесплатный :)), который избавит меня от склонной к ошибкам написания сквозных методов? Я знаю, что могу автоматически генерировать заглушки, используя VS, но это только дает мне половину пути.
Можете ли вы оценить целесообразность и желательность такой функции? Стоит ли предлагать Microsoft добавить этот тип генерации кода? Вы бы проголосовали, если бы я это сделал? Если нет, то какие у вас возражения?
редактировать
Кажется, все говорят одно и то же: почему бы мне просто не сделать_phone
а также_pda
в общественную собственность? Я возражаю против этого, что это нарушает «принцип наименьшего знания». Клиент моегоCellPhone
класс должен просто делать то, что делает сотовый телефон, он не должен иметь дело с выяснением того, какие функцииPhone
особенности и которыеPda
функции. Это создает дополнительные зависимости и делает функции интерфейса CellPhone менее очевидными.
Кроме того, не сосредотачивайтесь только на этом примере. Что если бы я писал адаптер? Он может содержать несколько элементов интерфейса, которые являются просто сквозными, но он также может содержать несколько уникальных членов с уникальной реализацией. Я считаю, что есть много случаев, когда сквозной код являетсяхорошая вещьЯ просто не люблю писать это.