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

时间:2018-04-01 08:59:40

标签: c# .net class oop interface

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

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

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

5 个答案:

答案 0 :(得分:3)

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

假设我们有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的具体实现,让我们说ConsoleLoggerFileLogger并将它们传递到SomeService 可互换,这样您就可以修改SomeMethod的结果("Message"将记录到Console或文件中)而不修改SomeService。因此,我们使用Dependency Injection反转控件。

答案 1 :(得分:1)

在第一种情况下,您只接触界面中的方法(推荐方式),而在后一种情况下,您将公开该类型中的所有公共内容。

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

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

答案 2 :(得分:1)

使用接口可以提供灵活性,这意味着您不依赖于某个特定的类/实现。

假设您有另一个字母类。

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"
    }
}

有关更深层次的样本和解释,请参阅此文章。 C# interfaces - What's the point?

答案 3 :(得分:0)

我们不能说我们来自'从界面我们说一个类'实现'界面。

如果我们依赖于接口而不是类,则意味着我们的类可以处理更一般的情况。

例如,我们可以使用方法发送信件

 Send(ILetter message){....}

我们可以使用此消息发送任何实现ILetter的字母。例如Class Bill : ILetter {...}

如果我们没有界面,我们就必须拥有

 Send(LoveLetter message){....}

 Send(Bill message){....}

答案 4 :(得分:0)

你已经得到了几个答案,讨论了使用interface的优点,但是它们都没有解决一个更简单,更基本的问题:你在询问OOP和class es不是C♯中的OOP,只有interface是。

如果你想在C♯中进行面向对象的编程,你必须只使用interface作为类型。 class es和struct定义抽象数据类型,而不是对象类型,只有interface定义对象类型。

  

我试图了解C#

中的高级OOP概念

这在C♯中甚至不是一个先进的OOP概念,它是C♯中OOP的基础,这是一个非常基本的概念,可能是 最基本的概念。

如果您想了解有关抽象数据类型和对象之间差异的更多信息(包括示例),那么您最好不要通过On Understanding Data Abstraction, Revisited阅读辉煌的William R. Cook。在文章中,库克没有具体谈论C♯,但他所说的很容易转移到C♯。