【问题标题】:Understanding Interfaces C#了解接口 C#
【发布时间】:2016-01-27 20:58:15
【问题描述】:

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

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);
    }
}

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

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

IMWSResponse response = null;

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

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

【问题讨论】:

  • 什么意思 把变量设为null是什么意思?它与设置为 null 的任何其他变量没有任何不同;这意味着它实际上并不指向任何东西。你有什么不明白的?
  • 将变量类型设置为接口有什么意义?我了解将变量设置为字符串、int 或其他数据类型,但何时需要将变量设置为接口类型。
  • 听起来你需要花一些时间阅读一本介绍性的编程书籍,或者类似的东西。这远远超出了 SO 问题的范围。
  • 抽象!!!因为系统应该依赖于声明而不是实现。这就是设计松散耦合系统的方式。这是一个post,用于了解接口与抽象类的基础知识。
  • 啊,好吧,我也想我也有一个小灯泡的时刻。从亚马逊获取信息的方法有一个返回类型叫做ListOrdersResponse,这个类实现了IMWSResponse,所以这就是变量response可以用来存储亚马逊方法调用返回的信息的原因。

标签: c# oop interface encapsulation


【解决方案1】:

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

将接口成员设置为null 的含义与将任何其他属性设置为null 相同 - 因为属性的set 访问器是一个方法,所以就像在接口上调用任何其他方法一样。 null 的含义取决于实现。

接口不实现彼此,因为和接口不能包含代码,因此没有实现;接口继承允许在另一个接口中需要一个接口。一个很大的例子是IEnumerable<T>,它与IEnumerable 紧密相关以至于它继承,因此意味着任何实现IEnumerable<T> 的类也必须实现IEnumerable。

【讨论】:

    【解决方案2】:

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

    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,尽管您有权这样做。接口的好处在于您可以将接口类型的变量设置为“继承”该接口的任何内容。

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多