适当的界面使用和说明

时间:2015-06-14 20:14:03

标签: c# interface

我一直在界面上喘气很长时间,我仍然无法理解他们的功能以及他们做了什么。我阅读了数以千计的论坛帖子,我一直在问自己一个问题。我会向你解释我所问的问题是什么。

我们有这个核心,它做了一件非常简单的事情。我们接受一个类,在主类中,我们使用接口调用在该类中声明的函数。

public interface IAnimal
{
   string GetDescription();
}

class Cat : IAnimal
{     
   public string GetDescription()
   {
      return "I'm a cat";
   }
}

class Program
{
    static void Main(string[] args)
    {
       Cat myCat = new Cat();

       Console.WriteLine(myCat.GetDescription());
    }
}

我一直在问自己的问题。我们为什么这样做?有什么意义? 为什么不简单地这样做:

class Cat
{     
   public static string GetDescription()
   {
      return "I'm a cat";
   }
}

class Program
{
    static void Main(string[] args)
    {
    Cat.GetDescription();
    }
}

我会非常感谢任何帮助和正确的解释。我愿意接受简单准确的例子。没有什么太复杂的了。我还希望你提供一些文字并解释为什么会这样,那就是。

谢谢。

编辑: 我很抱歉让一些人感到困惑。在第二个描述中,我忘了将public void cat更改为public static void cat,因此它无法访问且无法编译。

2 个答案:

答案 0 :(得分:1)

许多新程序员都会问这个问题,你会得到几个答案。我是计算机科学专业的学生,​​我会尽力向您解释。

  

接口提供了多重继承的替代方案。 C#允许你   只有一个基类固有,但我们可以实现尽可能多的基类   我们想要的接口。

您在上面发布的示例中有一个Cat类,它实现了一个接口IAnimal。我认为这有点不对,因为你应该使用Animal作为抽象类。实际上,这不会有任何区别,而你在这里尝试使用的概念是inheritance(一只猫继承自Animal)。以下行来自How to set notification with custom sound in android

  

如果您创建的功能在各种不同的对象中都有用,请使用界面。抽象类应主要用于密切相关的对象,而接口最适合为不相关的类提供通用功能。

所以现在你可能会想到接口的真正目的是什么以及何时使用它们。答案很简单,当您想对接口的用户(或实现接口的其他开发人员)施加某种限制或想要从几个类中提取常见内容时,请使用接口。

使用继承和接口的一个很好的例子是:

让我们假设您正在为电子设备构建软件。场景就像(父类 - >继承类): 小工具 - >电子小工具 - >电话小工具 - >手机 - >智能手机 - > Tablest

并表示手机,智能手机和平板电脑具有 FM-RADIO 的共同特征。其他小工具可以使用此功能,而不是电话小工具。现在,将FM-Radio用作接口将是完美的。每个小工具都会提供自己的FM-Radio定义,但所有小工具都会共享相同的功能。

希望我已经清除了你的困惑。

答案 1 :(得分:0)

因为稍微接近真实场景,您的代码将如下所示:

static void Main(string[] args)
{
    List<IAnimal> animals = GetAllZooAnimals();
    foreach (IAnimal animal in animals)
        ProcessAnimal(animal);
}

static void ProcessAnimal(IAnimal animal)
{
     Console.WriteLine(animal.GetDescription());
}

后来,当阴暗的遗传学家发明了Crococat:

public class Crococat : IAnimal
{
    public string GetDescription()
    {
        return "I'm a horrible concoction that looks like a furry crocodile with whiskers and paws.";
    }
}

没有必要更改Main()ProcessAnimal()因为GetAllZooAnimals()返回一种前所未见的动物类型。由于这些只关心所有动物可用的通用属性,因此它减少了我们在发明新动物时对程序代码所做的更改。