整天都在读取接口和抽象类,试图掌握它们以更好地理解我正在使用的亚马逊库。我有这段代码:
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背后的含义是什么?
另外,一个接口可以实现另一个接口吗?它不是只能实现接口的类,而是接口本身吗?
答案 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。接口的优点在于,您可以将接口类型的变量设置为“继承”该接口的任何内容。