当“更喜欢组合而不是继承”时生成传递代码

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (36)

比方说,我试图把手机建模成普通手机和PDA的结合。这是一种多重继承的场景(手机)电话,还有(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();
    }
}

这个类真正做的就是充当PhonePda上课。没有任何理由需要人工的努力来键入所有这些传递语句(如_phone.MakeCall(phoneNumber);)。它只是公开了几个成员字段的公共接口。

提问于
用户回答回答于

选择“生成委托方法“从”代码生成“菜单中选择”(使用默认快捷方式进行Alt-INSERT)。

如果有一个实现接口的类,其中包含实现相同接口的字段,则R#将为您提供一个生成传递代码的选项。它也可以与任意数量的接口一起工作。

用户回答回答于

拟议的语法如下:

public class CellPhone : IPhone, IPda
{
    private readonly IPhone _phone implements IPhone;
    private readonly IPda _pda : IPda;

    // ...
}

扫码关注云+社区