【问题标题】:Proper interface use and explanation正确的界面使用和解释
【发布时间】:2015-06-14 20:14:02
【问题描述】:

很长一段时间以来,我一直在为接口而喘不过气来,但我仍然无法理解它们的功能以及它们的作用。我阅读了数以千计的论坛帖子,并且一直在问自己一个问题。我会向你解释我要问的问题是什么。

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

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,因此它无法访问并且没有编译。

【问题讨论】:

  • 您的第二个示例甚至无法编译。 GetDescription() 不是静态方法,您正在尝试将其用作一个方法
  • 那时你可能没有阅读任何好的材料。界面是一个关键的软件设计概念,有无数的好例子。
  • 如果你是狗怎么办?
  • “我们上一节课”——这是你的问题。当您有多个类时,接口最有用。此外,当您试图了解该功能在现实世界中的用途时,使用这些人为的示例也无济于事。
  • 这不是一个简单的具体问题。它需要一个面向对象设计原则的教程,这不是正确的地方。

标签: c# interface


【解决方案1】:

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

接口提供了多重继承的替代方案。 C# 允许您 仅来自一个单一的基类,但我们可以实现尽可能多的 我们想要的接口。

您在上面发布的示例有一个 Cat 类,它实现了一个接口 IAnimal。我认为这有点错误,因为您应该使用 Animal 作为抽象类。务实地说,这不会有任何区别,但您在这里尝试使用的概念是inheritance(一只猫继承自动物)。以下行来自MSD

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

所以现在您可能会想,接口的真正用途是什么以及何时使用它们。答案很简单,当您想对接口的用户(或实现您的接口的其他开发人员)施加某种限制或想从多个类中提取共同的东西时,请使用接口。

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

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

比如说手机、智能手机和平板电脑都有FM-RADIO的共同特点。此功能在非电话小工具的其他小工具中可用。现在将FM-Radio用作接口将是完美的。每个小工具都会提供自己的 FM-Radio 定义,但都将共享相同的功能。

希望我已经消除了您的困惑。

【讨论】:

  • 所以我们有了 FM-RADIO 功能,它在所有其他小工具中都可用,当然,但只制作原型有什么意义。你没有保存任何东西,你没有得到任何东西。为什么不直接删除没有接口的功能呢?这会节省时间。我不明白。
  • 好问题。有两个原因。首先是我们希望我们的代码尽可能地面向对象。接口对此有所帮助。我前面提到的另一个原因是施加限制的想法。在本例中,FM-Radio 界面将帮助我们确保每个小工具都遵循相同的设计模式。这种统一的设计将帮助我们申请polymorphism。例如,我们想将所有设备调到特定频道。我们会在每台设备上调用相同的方法(接口),所有设备都会相应地进行调整。
【解决方案2】:

由于稍微接近真实世界的场景,您的代码如下所示:

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());
}

后来当阴暗的遗传学家发明了鳄鱼时:

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() 返回一种从未见过的动物。由于这些只关心所有动物可用的通用属性,因此它减少了我们在发明新动物时需要对程序代码进行的更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2020-11-17
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多