Генерация сквозного кода при «предпочтении композиции над наследованием»

проблема

Допустим, я пытаюсь смоделировать сотовый телефон как комбинацию обычного телефона и КПК. Это своего рода сценарий множественного наследования (сотовый телефонэто телефон, и этоэто 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 менее очевидными.

Кроме того, не сосредотачивайтесь только на этом примере. Что если бы я писал адаптер? Он может содержать несколько элементов интерфейса, которые являются просто сквозными, но он также может содержать несколько уникальных членов с уникальной реализацией. Я считаю, что есть много случаев, когда сквозной код являетсяхорошая вещьЯ просто не люблю писать это.

Ответы на вопрос(5)

Ваш ответ на вопрос