C# 接口和头

C# 接口和头,c#,c++,inheritance,interface,C#,C++,Inheritance,Interface,今天我遇到了C#接口的概念,我有一个简单的问题,看看我是否理解它们。。。它们是否相当类似于C++头文件?我的意思是,从我得到的信息来看,你定义了一个类的主干,但实际上没有定义它的功能,这有点类似于头,对吗?我阅读了整个MSDN的定义,但它并没有让我100%地明白。我相信我有这个想法(写了一个非常基本的程序,看看我是否理解),但非常重要的是,我至少要在明天晚上之前完全理解它们的基本知识 例子: 不,它与头文件不同。C++有头文件和CPP文件,这样可以声明和定义。C#将这些组合在一起,因此您没有单独

今天我遇到了C#接口的概念,我有一个简单的问题,看看我是否理解它们。。。它们是否相当类似于C++头文件?我的意思是,从我得到的信息来看,你定义了一个类的主干,但实际上没有定义它的功能,这有点类似于头,对吗?我阅读了整个MSDN的定义,但它并没有让我100%地明白。我相信我有这个想法(写了一个非常基本的程序,看看我是否理解),但非常重要的是,我至少要在明天晚上之前完全理解它们的基本知识

例子:
不,它与头文件不同。C++有头文件和CPP文件,这样可以声明和定义。C#将这些组合在一起,因此您没有单独的声明


C >代码>接口在C++中没有直接等价的。最接近的东西是C++中的抽象虚拟类。

< P>不,它们不是C/C++中的头。 它是“现代”语言(如C#和Java)中使用的概念。它允许每个类继承一组特征

它是一个纯抽象类,除了声明要用于继承的方法外,不包含任何代码


最常见的例子是C语言中的
IEnumerable
接口,它允许您在新定义的类对象上使用
foreach
语句。

从概念上讲,您似乎不理解接口

虽然C接口有一个特定的含义,更一般地说,在任何面向对象语言中,包括C++,你可以谈论一个类的“公共接口”。这本质上是另一个类可以看到的:它看不到私有成员,也看不到方法的内容,它只能看到其公共成员的签名

例如,如果我有一门课:

public class MyClass
{
    private int _myPrivateInt;
    public int MyPublicInt;

    private void DoSomethingPrivate(int input)
    {
        //Some code goes here
    }

    public void DoSomethingPublic(int input)
    {
        //Some more code goes here
    }
}
对于不同的类而言,所有“可见”的内容将是:

int MyPublicInt;
void DoSomethingPublic(int input);
这是为了封装——一个类不应该关心另一个类的具体实现细节。MyClass公开声明了其他类需要知道如何与之交互的内容,并将所有其他内容都保留在自己的范围内

这就是接口的实际含义,在C#中,接口基本上是一种在不使用公共方法的情况下指定信息的方式。要理解原因,您需要理解一个相关的概念,多态性。考虑这些类:

public class InMemoryCustomerDataStorage
{
    public void StoreCustomerInfo(CustomerInfo info)
    {
        //Actual implementation goes here
    }

    public CustomerInfo RetrieveCustomerInfo(int customerId)
    {
        //Actual implementation goes here
    }
}

public class DatabaseCustomerDataStorage
{
    public void StoreCustomerInfo(CustomerInfo info)
    {
        //Actual implementation goes here
    }

    public CustomerInfo RetrieveCustomerInfo(int customerId)
    {
        //Actual implementation goes here
    }
}

public class FileCustomerDataStorage
{
    public void StoreCustomerInfo(CustomerInfo info)
    {
        //Actual implementation goes here
    }

    public CustomerInfo RetrieveCustomerInfo(int customerId)
    {
        //Actual implementation goes here
    }
}
这三种方法的作用相同,但方式不同。它们都允许您存储客户信息,并通过id进行检索。它们还可能有我尚未写出的其他私有成员,例如,File one可能有一个方法创建文件(如果该文件不存在),等等。当然,它们都有实际的实现,而不是那些注释,我没有把它们全部写出来,因为这只是一个例子

那么,界面在这里如何派上用场呢?重点是,您的程序的某些部分可能希望存储和检索客户信息,但不关心它是如何完成的。事实上,一般来说,除非他们直接需要关心,否则他们不应该具体说明如何存储它。如果随着程序的增长,您需要更改所使用的存储类型,该怎么办?您必须在MemoryCustomerDataStorage中找到您编写的每个
位置,并将其替换为
数据库CustomerDataStorage
。或者,如果您想在大多数时间使用数据库,但在测试代码时,您想使用内存中的存储以使其快速运行,该怎么办?您甚至可以编写一个需要进行数据存储但本身不包含数据存储类的库。解决方法是使用接口。你会写:

public interface ICustomerDataStorage
{
    void StoreCustomerInfo(CustomerInfo info);
    CustomerInfo RetrieveCustomerInfo(int customerId);
}
然后,在需要进行一些客户数据存储的类中,可能会出现以下情况:

public class NewCustomerProcessor
{
    private ICustomerDataStorage _storage;

    public NewCustomerProcessor(ICustomerDataStorage storage)
    {
        _storage = storage;
    }

    public void Process(string name, string address, string email, int age)
    {
        CustomerInfo info = new CustomerInfo(name, address, email, age);
        if(Validate(info))
            _storage.StoreCustomerInfo(info);
    }

    private bool Validate(CustomerInfo info)
    {
         //Some validation logic
    }
}

现在这个类是完全功能化的,它不必担心使用了哪个icCustomerDataStorage的具体实现。它可以存储在内存中、文件中、数据库中,这并不重要。实现ICCustomerDataStorage的类可能位于完全不同的程序集和项目中,我可以将我的项目放在github上,无论谁下载在自己的项目中使用,都可以编写他们自己的ICuStudioDATA C++的实现。您还可以在接口中指定自动属性。从技术上讲,它们仍然是方法,但它们看起来不像。
public class NewCustomerProcessor
{
    private ICustomerDataStorage _storage;

    public NewCustomerProcessor(ICustomerDataStorage storage)
    {
        _storage = storage;
    }

    public void Process(string name, string address, string email, int age)
    {
        CustomerInfo info = new CustomerInfo(name, address, email, age);
        if(Validate(info))
            _storage.StoreCustomerInfo(info);
    }

    private bool Validate(CustomerInfo info)
    {
         //Some validation logic
    }
}