这可能是一个简单/基本的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");
}

可以使用以下备注进行修改:
  • 电话/MP3/电话MP3必须保持类(所有3个类)
  • 如果需要,我可以添加接口(interface)/其他类
  • TelephoneMP3不得复制Phone/MP3的所有功能(例如,在从接口(interface)继承的过程中,TelephoneMP3必须从所有接口(interface)成员中编写代码)

  • 先感谢您

    最佳答案

    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/

    10-10 15:17