C# 为什么在C中创建对象时选择接口类型?
我试图理解C语言中的高级OOP概念。假设我有一个从这个接口派生的接口和类。那么,为什么我们在创建对象或将参数传递给某个方法时需要decleare接口作为类型呢 接口传送器 { 无效阅读; } 班级情书:ILetter { 公开无效阅读{ Console.WriteLineLove字母阅读; } } 班级计划 { 静态环[]args { ILetter myLetter=新情书; 阅读; //输出:情书阅读 LoveLetter mySecondLetter=新的LoveLetter; 阅读; //输出:情书阅读 } }C# 为什么在C中创建对象时选择接口类型?,c#,.net,class,oop,interface,C#,.net,Class,Oop,Interface,我试图理解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。依赖注入是这里使用接口的关键之一。它有助于编写单元测试。我也能读懂这个