了解接口 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" 该接口的任何内容。
整天都在阅读有关接口和摘要的文章 类 试图掌握它们,以便更好地理解我正在使用的亚马逊图书馆。我有这个代码:
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" 该接口的任何内容。