了解接口C#

时间:2016-01-27 20:58:16

标签: c# oop interface encapsulation

整天都在读取接口和抽象类,试图掌握它们以更好地理解我正在使用的亚马逊库。我有这段代码:

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;

以后response用于存储调用方法调用后亚马逊发回的信息。 但是将接口类型的变量设置为null背后的含义是什么?

另外,一个接口可以实现另一个接口吗?它不是只能实现接口的类,而是接口本身吗?

2 个答案:

答案 0 :(得分:2)

Pproperties可以出现在接口中,因为属性实际上是方法 - T GetSomeValue()void SetSomeValue(T value)一起使用在其他语言中变得如此常见,C#将这些作为属性实现。

将界面成员设置为null背后的含义与设置null的任何其他属性相同 - 因为属性的set访问者是一种方法,它是&#39 ;比如在界面上调用任何其他方法。 null意味着实施的位置。

接口彼此实现,因为接口不能包含代码,因此没有实现;接口继承允许在另一个接口中需要一个接口。一个很好的例子是IEnumerable<T>,它与它继承的IEnumerable密切相关,因此任何实现IEnumerable<T>的类都必须实现IEnumerable

答案 1 :(得分:1)

界面就像合同协议。通过继承类的接口,您会说,“我同意实现此接口中定义的所有方法”。所以如果你有这样的界面:

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

通过其他接口“继承”接口,您只是同意在其他接口中实现任何方法,如此(来自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。接口的优点在于,您可以将接口类型的变量设置为“继承”该接口的任何内容。