这可能是一个简单/基本的OOP问题,但我仍然不知道如何解决。
在一次采访中,我遇到了以下问题:制作一个UML类图并编写“智能”电话的基本代码,其中包含电话和mp3播放器的功能。我们提供了以下(可接受的)解决方案:
class Telephone
{
public string name { get; set; }
public Telephone()
{
name = "name telephone";
}
}
class MP3
{
public string name { get; set; }
public MP3()
{
name = "name mp3";
}
}
和“智能”电话类:
class TelephoneMP3
{
public Telephone tel;
public MP3 mp3;
public TelephoneMP3()
{
tel = new Telephone();
mp3 = new MP3();
}
}
如您所见,我们在TelephoneMP3和Telephone/MP3类之间具有组合关系。
但是,使用此代码,TelephoneMP3也不是电话,而TelephoneMP3也不是MP3,这也不合逻辑。那么,为了使其有效,我应该进行哪些更改?例如,这种测试:
if (telMp3 is Telephone)
{
Console.WriteLine("TelephoneMP3 is telephone");
}
if (telMp3 is MP3)
{
Console.WriteLine("TelephoneMP3 is mp3");
}
可以使用以下备注进行修改:
先感谢您
最佳答案
C#不支持多重继承,您需要为常见的实现使用接口(interface)和抽象类,您可以执行以下操作:
编辑:我已经添加了更多详细信息到我的答案
abstract class BaseDevice
{
public string name { get; set; }
public void Print()
{
Console.WriteLine("{0}", name );
}
}
public interface IPhone
{
void DoPhone();
}
public interface IMP3
{
void DoMP3();
}
class Telephone :BaseDevice , IPhone
{
public Telephone()
{
name = "name telephone";
}
}
class MP3 : BaseDevice , IMP3
{
public MP3()
{
name = "name mp3";
}
}
class telMp3 : BaseDevice , IMP3, IPhone
{
private Telephone _tel;
private MP3 _mp3;
public telMp3()
{
name = "name telMp3";
}
public void DoPhone()
{
_tel.DoPhone();
}
public void DoMP3()
{
_mp3.DoMP3();
}
}
关于c# - C#OOP同时构成和泛化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24485226/