了解接口 C#

Understanding Interfaces C#

整天都在阅读有关接口和摘要的文章 类 试图掌握它们,以便更好地理解我正在使用的亚马逊图书馆。我有这个代码:

using MWSClientCsRuntime;

namespace MarketplaceWebServiceOrders.Model
{
    public interface IMWSResponse : IMwsObject
    {
        ResponseHeaderMetadata ResponseHeaderMetadata { get; set; }
    }

namespace MWSClientCsRuntime
{
    public interface IMwsObject
    {
        void ReadFragmentFrom(IMwsReader r);
        string ToXML();
        string ToXMLFragment();
        void WriteFragmentTo(IMwsWriter w);
        void WriteTo(IMwsWriter w);
    }
}

我的第一个问题是我认为接口不能包含字段,但是它们可以包含诸如 ResponseHeaderMetadata 的属性?

其次,在我的主程序中我有这行代码:

IMWSResponse response = null;

with response 稍后用于存储调用方法调用后亚马逊发回的信息。 但是接口类型的变量设置为null是什么意思呢?

还有,一个接口可以实现另一个接口?不仅类可以实现接口,接口本身也可以实现?

属性可以出现在接口中,因为属性实际上是方法 - T GetSomeValue()void SetSomeValue(T value) 的使用在其他语言中变得如此普遍,以至于 C# 将这些实现为属性。

将接口成员设置为 null 的含义与将任何其他 属性 设置为 null 的含义相同 - 因为 属性 的 set accessor 是一种方法,就像调用接口上的任何其他方法一样。 null 意味着什么取决于实施。

接口不相互实现,因为接口不能包含代码,因此不实现;接口继承允许一个人在另一个接口中要求一个接口。一个重要的例子是它继承的 IEnumerable<T>, which is so closely tied to IEnumerable,因此意味着任何 class 实现 IEnumerable<T> 也必须实现 IEnumerable.

接口就像一个合同协议。通过从 class 继承接口,您说的是 "I agree to implement all of the methods defined in this interface"。所以如果你有这样的界面:

public interface IWorker    {
    void DoWork();
}

然后你像这样使用那个界面:

public class Employee : IWorker
{
    // you are forced to implement this method
    void DoWork {}
}

public class Contractor: IWorker
{
    // you are forced to implement this method
    void DoWork {}
}

通过其他接口的"inheriting"接口,您只是同意在其他接口中实现任何方法,就像这样(来自MSDN):

interface IBase
{
   void F();
}
interface IDerived: IBase
{
   void G();
}
class C: IDerived
{
   void IBase.F() {...}
   void IDerived.G() {...}
}
class D: C, IDerived
{
   public void F() {...}
   public void G() {...}
}

您不必将接口类型的变量设置为 null,尽管您有权这样做。接口的伟大之处在于,您可以将接口类型的变量设置为 "inherits" 该接口的任何内容。