c#接口...
时间:2010-08-19 来源:caianye
抽象类往往是一系列派生类的基类,而接口的作用是将协定混入其它继承树。
接口定义语法如下:
[性质][访问修饰符] interface 接口名 [:基列表]
{ 接口主体 }
interface IStorable
{
void Read();
void Write(object);
}
接口的目的是定义类中该有的功能。接口中没有访问修饰符,隐含就是public,事实上,如果有的话,会产生编译错误。因为接口是要由其它类使用的协定。不能创建接口的实例,但我们可以实例化一个类来实现接口。
public class Document : IStorable
{
public void Read() { … }
public void Write(object obj) { … }
}
现在Document类负责提供IStorable方法的具体实现了。我们指定Document要实现IStorable,因此必须实现所有的IStorable方法,否则编译时会出错。
类可以实现多个接口。
interface ICompressible
{
void Compress();
void Decompress();
}
public class Document : IStorable, ICompressible
扩展接口:
interface ILoggedCompressible : ICompressible
{
void LogSavedBytes();
}
组合接口:
interface IStorableCompressible : IStorable, ILoggedCompressible
{
void LogOriginalSize();
}
接口与抽象类的比较:
接口与抽象类非常相似。事实上,我们可以把IStorable的声明改成抽象类:
abstract class Storable
{
abstract public void Read();
abstract public void Write();
}
但是,假如我们从第三方厂商买了一个List类,我们要将其功能与Storable中指定的功能结合使用,会怎么样呢?C++中我们可以创建一个StorableList类,同时继承List和Storable。但C#中就不行了,因为C#不允许类多重继承。
不过,C#允许我们实现多个接口,并从一个基类派生。这样,我们可以将Storable变成一个接口,然后从List类和IStorable继承。如下所示:
public class StorableList : List, IStroable
{
//方法列表
…………
}
重定义接口的实现:
实现类可以自由地将任何或全部实现接口的方法标记为虚。派生类可以重定义或提供新的实现。
using System;
namespace overridingInterface
{
interface IStorable
{
void Read();
void Write();
};
public class Document : IStorable
{
public Document(string s)
{
Console.WriteLine("Creating document with: {0}", s);
}
//使Read为虚方法, 可以实现多态的效果
public virtual void Read()
{
Console.WriteLine("Document Read Method for IStorable");
}
//不为虚, 不可以实现多态的效果
public void Write()
{
Console.WriteLine("Document Write Method for IStorable");
}
};
public class Note : Document
{
public Note(string s):base(s)
{
Console.WriteLine("Creating note with: {0}", s);
}
//重定义read方法
public override void Read()
{
Console.WriteLine("Overriding the Read method for Note!");
}
//实现自己的Write方法
public new void Write()
{
Console.WriteLine("Implementing the Write method for Note!");
}
};
}