【发布时间】:2011-01-10 03:52:09
【问题描述】:
问题
假设我正在尝试将手机建模为普通手机和 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 }
}
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);)。它只是暴露了几个成员字段的公共接口。
问题
有没有一种工具(最好是免费的 :))可以让我免于编写传递方法时容易出错的乏味?我知道我可以使用 VS 自动生成存根,但这只能让我完成一半。
您能否评价此类功能的可行性和可取性?是否值得向 Microsoft 提出添加此类代码生成的建议?如果我这样做,你会投票吗?如果没有,您有什么反对意见?
编辑
似乎每个人都在说同样的话:我为什么不把_phone 和_pda 变成公共属性?我对此的反对是,它违反了“最少知识原则”。我的CellPhone 课程的客户应该只做手机所做的事情,它不应该处理找出哪些功能是Phone 功能以及哪些是Pda 功能。这会产生额外的依赖关系,并使 CellPhone 界面的功能不那么明显。
另外,不要只关注这个例子。如果我正在编写一个适配器怎么办?它可能包含几个只是传递的接口成员,但它也可能包含一些具有唯一实现的唯一成员。我相信在很多情况下,传递代码是一个好东西,我只是不喜欢写它。
【问题讨论】:
-
只是不明白为什么要再次公开这些相同的方法。为什么要注意只是添加方法,“getPhone”或“getPDA”,然后就可以了。除非你真的要在 CellPhone 类中有一些智能,在这种情况下,这个样板代码是无关紧要的。
-
@yar,这意味着客户端类必须参与 CellPhone 类的管道。
Client不必知道CellPhone实际上是Phone和Pda的组合。它应该直接处理CellPhone本身。这基本上是“知识最少的原则——只和你的直系朋友交谈。” -
是的,我明白了。我想客户没有理由知道电话或 PDA 上有什么。
标签: c# visual-studio design-patterns code-generation