C# 为什么在C中创建对象时选择接口类型?

C# 为什么在C中创建对象时选择接口类型?,c#,.net,class,oop,interface,C#,.net,Class,Oop,Interface,我试图理解C语言中的高级OOP概念。假设我有一个从这个接口派生的接口和类。那么,为什么我们在创建对象或将参数传递给某个方法时需要decleare接口作为类型呢 接口传送器 { 无效阅读; } 班级情书:ILetter { 公开无效阅读{ Console.WriteLineLove字母阅读; } } 班级计划 { 静态环[]args { ILetter myLetter=新情书; 阅读; //输出:情书阅读 LoveLetter mySecondLetter=新的LoveLetter; 阅读; /

我试图理解C语言中的高级OOP概念。假设我有一个从这个接口派生的接口和类。那么,为什么我们在创建对象或将参数传递给某个方法时需要decleare接口作为类型呢

接口传送器 { 无效阅读; } 班级情书:ILetter { 公开无效阅读{ Console.WriteLineLove字母阅读; } } 班级计划 { 静态环[]args { ILetter myLetter=新情书; 阅读; //输出:情书阅读 LoveLetter mySecondLetter=新的LoveLetter; 阅读; //输出:情书阅读 } }
在第一种情况下,您只从接口推荐的方式公开方法,而在后一种情况下,您公开类型中的所有公共方法

在类型中创建一个公共方法,并尝试在这两种情况下访问它,您将看到区别


强烈建议您针对抽象而不是具体类型进行编程。

我们不是说我们从接口“派生”,而是说类“实现”了接口

class Program 
{
    static void Main(string[] args) 
    {
        ILetter myLetter = new LoveLetter();
        myLetter.Read();
        //Output : "Love Letter Reading"

        myLetter = new LeaveApplicationLetter ();
        myLetter.Read();
        //Output : "I'm on vacation"        

        LoveLetter mySecondLetter = new LoveLetter();
        mySecondLetter.Read();
        //Output : "Love Letter Reading"
    }
}
如果我们依赖于接口而不是类,这意味着我们的类可以处理更一般的情况

例如,我们可以有一个方法来发送一封信

 Send(ILetter message){....}
我们可以使用此消息发送任何实现ILetter的信件。例如班上的比尔:ILetter{…}

如果我们没有接口,我们将不得不使用

 Send(LoveLetter message){....}

 Send(Bill message){....}

通过接口而不是具体类型实现某些功能的访问方法,可以灵活地更改所访问功能的实现,而无需更改该功能的客户端

假设我们有ILogger接口

public interface ILogger
{
     void Log(string message);
}
和该接口的客户端

public class SomeService
{
    private readonly ILogger _logger; 

    public SomeService(ILogger logger)
    { 
        _logger = logger;
    }

    public void SomeMethod()
    {
        _logger.Log("Some message");
    }
 }

您可以创建ILogger的具体实现,比如ConsoleLogger和FileLogger,并将它们互换地传递到SomeService,这样您就可以修改SomeMethod的结果消息将被记录到Console或文件中,而无需修改SomeService。因此,我们使用反转控件。

使用接口允许灵活性,这意味着您不依赖于某个特定的类/实现

假设你有另一个字母类

class LeaveApplicationLetter : ILetter
{
    public void Read(){
        Console.WriteLine("I'm on vacation");
    }
}
您可以使用该接口的其他实现

class Program 
{
    static void Main(string[] args) 
    {
        ILetter myLetter = new LoveLetter();
        myLetter.Read();
        //Output : "Love Letter Reading"

        myLetter = new LeaveApplicationLetter ();
        myLetter.Read();
        //Output : "I'm on vacation"        

        LoveLetter mySecondLetter = new LoveLetter();
        mySecondLetter.Read();
        //Output : "Love Letter Reading"
    }
}

有关更深入的示例和解释,请参见此示例

您已经得到了几个关于使用接口的优点的答案,但是没有一个答案能够解决一个更简单、更基本的问题:您询问的是OOP,而类在C中不是OOP♯, 只有接口是可用的

如果你想用C语言进行面向对象的编程♯, 只能将接口用作类型。类和结构定义抽象数据类型,而不是对象类型,只有接口定义对象类型

我试图理解C语言中的高级OOP概念

这甚至不是C语言中的高级OOP概念♯, 这是C语言中面向对象编程的基础。♯, 一个非常基本的概念,也许是最基本的概念


如果您想了解更多关于抽象数据类型和对象之间差异的信息(包括示例),那么最好阅读brilliant by。在这篇文章中,库克没有特别提到C♯, 但他所说的很容易转换成C♯.

基于接口的设计(也称契约式设计)是一种体系结构技术,它有助于实现Lovelette的强解耦。因此,对实现的更改对程序的其余部分影响很小。测试变得更容易,对依赖注入更友好。然而,对界面的更改往往非常残酷,您必须提前仔细考虑。总是很难做到,而且不是很灵活。同意@HansPassant。依赖注入是这里使用接口的关键之一。它有助于编写单元测试。我也能读懂这个