【问题标题】:interface concept in C# [duplicate]C#中的接口概念[重复]
【发布时间】:2011-10-20 14:42:30
【问题描述】:

可能重复:
What are some advantages to using an interface in C#?

为什么我们在 C# 中使用接口。使用接口有什么好处。请您解释一下这个概念,以便于理解和简单的接口示例?

【问题讨论】:

标签: c#


【解决方案1】:

接口是一种将……接口与实现分开的方式。

你可以说这是一个给我第 n 个素数的函数。就是这个界面。如果我是用户,我不在乎你如何计算它——所以我只需要接口。

接口也为多重继承提供了另一种选择——你可以只有一个基类,但可以实现多个接口。

例子:

interface IPrimeComputer {
    int GetNPrime(int n);
}

class SieveComputer : IPrimeComputer {
    public int GetPrime(int n) {
        //compute the nth prime using a sieve
    }
}

class MagicComputer : IPrimeComputer {
    public int GetPrime(int n) {
        //compute the nth prime using some magic that no one else can understand.
    }
}

...
 IPrimeComputer computer = new MagicComputer();

 int nprime = computer.GetPrime(100);

 computer = new SieveComputer();

 nprime = computer.GetPrime(100);

【讨论】:

  • 这解释了“什么”而不是真正的“为什么”。此外,说接口本身提供多重继承有点误导。您不会从接口继承任何东西,它是一个指定您必须实现的合同。相反,您可以说接口比继承更适合多态性。
  • 同意@Evil Pigeon。我认为问题是关于“为什么”。
【解决方案2】:

实现一个界面说嘿!看着我!我可以做这个。

接口适用于许多应用程序:

  • 单元测试:如果您的方法接受接口作为参数,您可以传递模拟对象来测试错误,确保发现的任何错误都不是由参数中的错误引起的。
  • 代码重用:如果使用接口,您可以使代码更通用,而更通用的代码更适合重用。例如,UI 控件是高度可重用的组件,它使用 INotifyPropertyChanged 等接口,当实现这些接口时,您的自定义类可以很好地与数据绑定配合使用。
  • 软件工程最佳实践:最好将规范与实现分开,因为更聪明、更有经验的人会这么说。还有很多好的设计模式需要使用接口。
  • mixins:结合扩展方法,你可以使用接口来实现准mixins。当您在类上实现该接口时,该类将继承相关功能。我能想到的最好的例子是 LINQ 扩展方法,它适用于实现 IEnumerable 的类。接口本身不会给我们多重继承,但 mixin 可以。
  • 跨越系统边界: 为您希望跨越系统边界的对象(即 Web 服务)创建接口通常很不错。这可以简化序列化并允许您在不影响两个系统之间的接口的情况下修改具体类。

【讨论】:

  • 这不也有助于部署吗?我可以想象我们可以发布一个新的产品版本,它通过给定的接口而不是它的实际实现来引用(通过 dll)系统的另一部分。并且可能意味着每次我们发布新产品时都不需要重新编译和重新部署后者。 (接口往往很少改变,我们宁愿参考它而不是它的实现)。对吗?
【解决方案3】:

是的,接口涉及到 C# 不支持多重继承这一事实,但这不是你应该使用接口的原因。正如彼得所说,这是一种将对象的实现与对象的功能分开的方法。接口定义了您可以对对象执行的操作(功能),但对象的实现定义了您的操作方式。

假设您正在制作一个图形程序,您可以在其中将形状打印到要旋转的屏幕上。然后你可能有一个接口IShape 定义了方法RotateDraw 但这些方法的真正实现在于类RectangleCircle 等,因为你很可能想要使用多个形状。

【讨论】:

    【解决方案4】:

    有关接口What are some advantages to using an interface in C#? 的优点,请参阅此 SO 问题

    一个简单的接口示例可能是:

    public interface IAnimal
    {
    
        void Sleep();
    
        void Run();
    
        void Talk();
    }
    

    然后接口将由一个类实现,该类将实现接口中指定的方法:

    public class Dog : IAnimal
    {
    
        public void Talk()
        {
            Console.WriteLine("Ruff!");
        }
    
        public void Run()
        {
            Console.WriteLine("The dog runs after balls and cars.");
        }
    
        public void Sleep()
        {
            Console.WriteLine("ZZZZZZZZZZ");
        }
    }
    

    不同的类会以不同的方式实现相同的方法:

    public class Cat : IAnimal
    {
    
        public void Talk()
        {
            Console.WriteLine("Meow");
        }
    
        public void Run()
        {
            Console.WriteLine("The cat looks at you and says, 'Yeah, right...'");
        }
    
        public void Sleep()
        {
            Console.WriteLine("All the time - what else does a cat do?");
        }
    }
    

    这些只是简单的例子,但应该会给你一个想法。

    【讨论】:

      【解决方案5】:

      一个好处是实现接口的类别无选择,只能以自己的方式实现接口的方法。

      因此,如果您是接口的创建者,而其他程序员需要从他们自己的类中实现它,那么这些类将具有来自您接口的模式。

      【讨论】:

        猜你喜欢
        • 2013-10-18
        • 2016-08-30
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 2014-04-03
        相关资源
        最近更新 更多