定义:用 abstract 修饰的类是抽象类。
1、抽象类使用abstract修饰符来修饰,抽象方法也必须用abstract来修饰,抽象方法不能有方法体。抽象类中可以不包含抽象方法,抽象方法一定在抽象类中。
2、抽象类不能被实例化。abstract关键字修饰的方法必须被其子类重写才有意义。
3、抽象类中可包含属性、方法(普通方法和抽象方法)、构造方法()、初始化块,内部类,枚举类六种成分。没有抽象属性和抽象变量的概念。
一、抽象类和接口
抽象类型和接口是用于指定编程抽象的两种机制。抽象指定继承者或实施者必须遵循的一个协定。
抽象类提供多个派生类共享基类的公共定义。
接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。
接口是抽象类的一个变体。
相同点:
1、都不能被直接实例化,都可以通过继承实现其抽象方法。
不同点:
1、抽象类型可以选择提供实现的详细信息;而接口不能提供实现的任何详细信息。
2、抽象类可包含抽象方法,也可不包含抽象方法;而接口只能有抽象方法。
3、接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
二、代码实现
FCL对集合类使用了基于接口的设计,所以请关注System.Collections中关于接口的设计实现。
FCL对数据流相关类使用了基于抽象类的设计,所以请关注System.IO.Stream类的抽象类设计机制。
例如,.NET Framework 提供抽象类 WebRequest 向统一资源标识符发送请求,使用 WebResponse 接收统一资源标识符的回复。Framework 提供了 HttpWebRequest 和 HttpWebResponse 类,分别作为这两个抽象类的几个具体实现之一,它们是相应抽象类的 HTTP 特定的实现。
1. 定义抽象类
public abstract class Animal
{
protected string _name;
//声明抽象属性
public abstract string Name
{
get;
}
//声明抽象方法
public abstract void Show();
//实现一般方法
public void MakeVoice()
{
Console.WriteLine("All animals can make voice!");
}
}
2. 定义接口
public interface IAction
{
//定义公共方法标签
void Move();
}
3. 实现抽象类和接口
public class Duck : Animal, IAction
{
public Duck(string name)
{
_name = name;
}
//重载抽象方法
public override void Show()
{
Console.WriteLine(_name + " is showing for you.");
}
//重载抽象属性
public override string Name
{
get { return _name;}
}
//实现接口方法
public void Move()
{
Console.WriteLine("Duck also can swim.");
}
}
public class Dog : Animal, IAction
{
public Dog(string name)
{
_name = name;
}
public override void Show()
{
Console.WriteLine(_name + " is showing for you.");
}
public override string Name
{
get { return _name; }
}
public void Move()
{
Console.WriteLine(_name + " also can run.");
}
}
4. 客户端实现
public class TestAnmial
{
public static void Main(string [] args)
{
Animal duck = new Duck("Duck");
duck.MakeVoice();
duck.Show();
Animal dog = new Dog("Dog");
dog.MakeVoice();
dog.Show();
IAction dogAction = new Dog("A big dog");
dogAction.Move();
}
}
三、抽象类不一定为基础类,即抽象类可继承其他类
1 // compile with: /target:library
2 public class D
3 {
4 public virtual void DoWork(int i)
5 {
6 // Original implementation.
7 }
8 }
9
10 public abstract class E : D
11 {
12 public abstract override void DoWork(int i);
13 }
14
15 public class F : E
16 {
17 public override void DoWork(int i)
18 {
19 // New implementation.
20 }
21 }
四、示例
using System;
using System.IO;
using System.Net.Cache;
using System.Net.Security;
using System.Runtime.Serialization;
using System.Security.Principal;
namespace System.Net
{
// 摘要:
// 发出对统一资源标识符 (URI) 的请求。这是一个 abstract 类。
[Serializable]
public abstract class WebRequest : MarshalByRefObject, ISerializable
{
// 摘要:
// 初始化 System.Net.WebRequest 类的新实例。
protected WebRequest();
//
// 摘要:
// 从 System.Runtime.Serialization.SerializationInfo 和 System.Runtime.Serialization.StreamingContext
// 类的指定实例初始化 System.Net.WebRequest 类的新实例。
//
// 参数:
// serializationInfo:
// System.Runtime.Serialization.SerializationInfo,包含序列化新的 System.Net.WebRequest
// 实例所需的信息。
//
// streamingContext:
// System.Runtime.Serialization.StreamingContext,指示与新的 System.Net.WebRequest
// 实例关联的序列化流的源。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该构造函数时,试图访问该构造函数。
protected WebRequest(SerializationInfo serializationInfo, StreamingContext streamingContext);
// 摘要:
// 获取或设置用于此请求的身份验证和模拟的级别。
//
// 返回结果:
// System.Net.Security.AuthenticationLevel 值的按位组合。默认值为 System.Net.Security.AuthenticationLevel.MutualAuthRequested。在相互身份验证中,客户端和服务器双方都出示凭据以确定其身份。System.Net.Security.AuthenticationLevel.MutualAuthRequired
// 和 System.Net.Security.AuthenticationLevel.MutualAuthRequested 值与 Kerberos
// 身份验证有关。可以直接支持 Kerberos 身份验证,也可以仅在使用 Negotiate 安全协议选择实际的安全协议时使用该身份验证。有关身份验证协议的更多信息,请参见
// Internet 身份验证。若要确定相互身份验证是否发生,请检查 System.Net.WebResponse.IsMutuallyAuthenticated
// 属性。如果您指定了 System.Net.Security.AuthenticationLevel.MutualAuthRequired 身份验证标志值,而未发生相互身份验证,则应用程序将收到一个带有
// System.Net.ProtocolViolationException 内部异常的 System.IO.IOException,指示相互身份验证失败。
public AuthenticationLevel AuthenticationLevel { get; set; }
//
// 摘要:
// 获取或设置此请求的缓存策略。
//
// 返回结果:
// 定义缓存策略的 System.Net.Cache.RequestCachePolicy 对象。
public virtual RequestCachePolicy CachePolicy { get; set; }
//
// 摘要:
// 当在子类中重写时,获取或设置请求的连接组的名称。
//
// 返回结果:
// 请求的连接组的名称。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual string ConnectionGroupName { get; set; }
//
// 摘要:
// 当在子类中被重写时,获取或设置所发送的请求数据的内容长度。
//
// 返回结果:
// 发送的请求数据的字节数。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual long ContentLength { get; set; }
//
// 摘要:
// 当在子类中被重写时,获取或设置所发送的请求数据的内容类型。
//
// 返回结果:
// 请求数据的内容类型。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual string ContentType { get; set; }
//
// 摘要:
// 当在子类中被重写时,获取或设置用于对 Internet 资源请求进行身份验证的网络凭据。
//
// 返回结果:
// 包含与该请求关联的身份验证凭据的 System.Net.ICredentials。默认为 null。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual ICredentials Credentials { get; set; }
//
// 摘要:
// 获取或设置此请求的默认缓存策略。
//
// 返回结果:
// 一个 System.Net.Cache.HttpRequestCachePolicy,它指定当没有其他策略适用时对此请求有效的缓存策略。
public static RequestCachePolicy DefaultCachePolicy { get; set; }
//
// 摘要:
// 获取或设置全局 HTTP 代理。
//
// 返回结果:
// 对 System.Net.WebRequest 实例的每一次调用所使用的 System.Net.IWebProxy。
//
// 异常:
// System.ArgumentNullException:
// 为 Set 操作指定的值为 null。
public static IWebProxy DefaultWebProxy { get; set; }
//
// 摘要:
// 当在子类中被重写时,获取或设置与请求关联的标头名称/值对的集合。
//
// 返回结果:
// 包含与此请求关联的标题名/值对的 System.Net.WebHeaderCollection。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual WebHeaderCollection Headers { get; set; }
//
// 摘要:
// 获取或设置当前请求的模拟级别。
//
// 返回结果:
// System.Security.Principal.TokenImpersonationLevel 值。
public TokenImpersonationLevel ImpersonationLevel { get; set; }
//
// 摘要:
// 当在子类中被重写时,获取或设置要在此请求中使用的协议方法。
//
// 返回结果:
// 在此请求中使用的协议方法。
//
// 异常:
// System.NotImplementedException:
// 在子类中未重写该属性的情况下,试图获取或设置该属性。
public virtual string Method { get; set; }
//
// 摘要:
// 当在子类中被重写时,指示是否对请求进行预身份验证。
//
// 返回结果:
// 若要进行预身份验证,则为 true;否则为 false。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual bool PreAuthenticate { get; set; }
//
// 摘要:
// 当在子类中被重写时,获取或设置用于访问此 Internet 资源的网络代理。
//
// 返回结果:
// 用于访问 Internet 资源的 System.Net.IWebProxy。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual IWebProxy Proxy { get; set; }
//
// 摘要:
// 当在子类中被重写时,获取与请求关联的 Internet 资源的 URI。
//
// 返回结果:
// 表示与请求关联的资源的 System.Uri。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual Uri RequestUri { get; }
//
// 摘要:
// 获取或设置请求超时之前的时间长度(以毫秒为单位)。
//
// 返回结果:
// 请求超时前的时间长度(以毫秒为单位)或指示请求不超时的 System.Threading.Timeout.Infinite 值。默认值是由子代类定义的。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该属性时,试图获取或设置该属性。
public virtual int Timeout { get; set; }
//
// 摘要:
// 当在子代类中重写时,获取或设置一个 System.Boolean 值,该值控制 System.Net.CredentialCache.DefaultCredentials
// 是否随请求一起发送。
//
// 返回结果:
// 如果使用默认凭据,则为 true;否则为 false。默认值为 false。
//
// 异常:
// System.InvalidOperationException:
// 您试图在该请求发送之后设置此属性。
public virtual bool UseDefaultCredentials { get; set; }
// 摘要:
// 中止请求
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该方法时,试图访问该方法。
public virtual void Abort();
//
// 摘要:
// 当在子类中重写时,提供 System.Net.WebRequest.GetRequestStream() 方法的异步版本。
//
// 参数:
// callback:
// System.AsyncCallback 委托。
//
// state:
// 包含此异步请求的状态信息的对象。
//
// 返回结果:
// 引用该异步请求的 System.IAsyncResult。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该方法时,试图访问该方法。
public virtual IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state);
//
// 摘要:
// 当在子类中被重写时,开始对 Internet 资源的异步请求。
//
// 参数:
// callback:
// System.AsyncCallback 委托。
//
// state:
// 包含此异步请求的状态信息的对象。
//
// 返回结果:
// 引用该异步请求的 System.IAsyncResult。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该方法时,试图访问该方法。
public virtual IAsyncResult BeginGetResponse(AsyncCallback callback, object state);
//
// 摘要:
// 为指定的 URI 方案初始化新的 System.Net.WebRequest 实例。
//
// 参数:
// requestUriString:
// 标识 Internet 资源的 URI。
//
// 返回结果:
// 特定 URI 方案的 System.Net.WebRequest 子代。
//
// 异常:
// System.NotSupportedException:
// requestUriString 中指定的请求方案尚未注册。
//
// System.ArgumentNullException:
// requestUriString 为 null。
//
// System.Security.SecurityException:
// 调用方没有连接到请求的 URI 或请求重定向到的 URI 上的权限。
//
// System.UriFormatException:
// requestUriString 中指定的 URI 不是有效的 URI。
public static WebRequest Create(string requestUriString);
//
// 摘要:
// 为指定的 URI 方案初始化新的 System.Net.WebRequest 实例。
//
// 参数:
// requestUri:
// 包含请求的资源的 URI 的 System.Uri。
//
// 返回结果:
// 指定的 URI 方案的 System.Net.WebRequest 子代。
//
// 异常:
// System.NotSupportedException:
// requestUri 中指定的请求方案未注册。
//
// System.ArgumentNullException:
// requestUri 为 null。
//
// System.Security.SecurityException:
// 调用方没有连接到请求的 URI 或请求重定向到的 URI 上的权限。
public static WebRequest Create(Uri requestUri);
//
// 摘要:
// 为指定的 URI 方案初始化新的 System.Net.WebRequest 实例。
//
// 参数:
// requestUri:
// 包含请求的资源的 URI 的 System.Uri。
//
// 返回结果:
// 指定的 URI 方案的 System.Net.WebRequest 子代。
//
// 异常:
// System.NotSupportedException:
// requestUri 中指定的请求方案未注册。
//
// System.ArgumentNullException:
// requestUri 为 null。
//
// System.Security.SecurityException:
// 调用方没有连接到请求的 URI 或请求重定向到的 URI 上的权限。
public static WebRequest CreateDefault(Uri requestUri);
//
// 摘要:
// 当在子类中重写时,返回用于将数据写入 Internet 资源的 System.IO.Stream。
//
// 参数:
// asyncResult:
// 引用对流的挂起请求的 System.IAsyncResult。
//
// 返回结果:
// 将数据写入的 System.IO.Stream。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该方法时,试图访问该方法。
public virtual Stream EndGetRequestStream(IAsyncResult asyncResult);
//
// 摘要:
// 当在子类中重写时,返回 System.Net.WebResponse。
//
// 参数:
// asyncResult:
// 引用对响应的挂起请求的 System.IAsyncResult。
//
// 返回结果:
// 包含对 Internet 请求的响应的 System.Net.WebResponse。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该方法时,试图访问该方法。
public virtual WebResponse EndGetResponse(IAsyncResult asyncResult);
//
// 摘要:
// 使用将目标对象序列化所需的数据填充 System.Runtime.Serialization.SerializationInfo。
//
// 参数:
// serializationInfo:
// 要填充数据的 System.Runtime.Serialization.SerializationInfo。
//
// streamingContext:
// 用于指定该序列化的目标的 System.Runtime.Serialization.StreamingContext。
protected virtual void GetObjectData(SerializationInfo serializationInfo, StreamingContext streamingContext);
//
// 摘要:
// 当在子类中重写时,返回用于将数据写入 Internet 资源的 System.IO.Stream。
//
// 返回结果:
// 用于将数据写入 Internet 资源的 System.IO.Stream。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该方法时,试图访问该方法。
public virtual Stream GetRequestStream();
//
// 摘要:
// 当在子类中被重写时,返回对 Internet 请求的响应。
//
// 返回结果:
// 包含对 Internet 请求的响应的 System.Net.WebResponse。
//
// 异常:
// System.NotImplementedException:
// 当未在子类中重写该方法时,试图访问该方法。
public virtual WebResponse GetResponse();
//
// 摘要:
// 返回当前模拟用户的 Internet Explorer 设置中配置的代理。
//
// 返回结果:
// 对 System.Net.WebRequest 实例的每一次调用所使用的 System.Net.IWebProxy。
public static IWebProxy GetSystemWebProxy();
//
// 摘要:
// 为指定的 URI 注册 System.Net.WebRequest 子代。
//
// 参数:
// prefix:
// System.Net.WebRequest 子代为其提供服务的完整 URI 或 URI 前缀。
//
// creator:
// 创建方法,System.Net.WebRequest 调用它以创建 System.Net.WebRequest 子代。
//
// 返回结果:
// 如果注册成功,则为 true;否则为 false。
//
// 异常:
// System.ArgumentNullException:
// prefix 为 null- 或 - creator 为 null。
public static bool RegisterPrefix(string prefix, IWebRequestCreate creator);
}
}
http://www.cnblogs.com/anytao/archive/2007/04/12/must_net_02.html