Problem
假设我正在尝试将一部手机建模为普通手机和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();
}
Implementations:
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 }
}
CellPhone类
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);
)。它只是公开了几个成员字段的公共接口。
问题
编辑
似乎每个人都在说同样的话:为什么我不把_phone
和_pda
变成公共属性呢?我反对这一点,因为它违反了“最低知识原则”。我的CellPhone
类的客户端应该只做手机所做的事情,它不应该去处理哪些功能是Phone
功能,哪些是Pda
功能。这会创建额外的依赖项,并使CellPhone接口的功能不那么明显。
另外,不要只关注这个例子。如果我正在编写一个适配器呢?它可能包含几个只是传递的接口成员,但也可能包含一些具有唯一实现的唯一成员。我相信在很多情况下,直通代码是一件好事,我只是不喜欢写它。
https://stackoverflow.com/questions/2150416
复制相似问题