利用接口实现操作分离

来源:互联网 发布:十佳网络教育机构 编辑:程序博客网 时间:2024/05/07 23:02

本人最近遇到要在页面中显示许多格式不同的文挡的问题,因为每个文挡的格式都是不一样的,每个文挡在页面显示的界面都是不同的,但是

它们又都有一些相同之处,比如都有创建时间、保存操作等。

一时心血来潮,想把所有文挡都抽象一下,做了些尝试,水平有限,遇到不少困难,请大虾们教导和提意见。

如果要在页面中显示不同的文挡,创建时间、保存操作等是都有的,但是具体的显示文挡内容,因为受到每个页面的UI不同好象不能抽象。
代码如下:

using System;
namespace ClassLibrary1
{
 /// <summary>
 /// doc 的摘要说明。
 /// </summary>
 public interface IDoc
 {
  
  DateTime createTime
  {
   get;
   set;
  }

  void Save();
 }
 //具体的文挡类
 public class concreteDoc1:IDoc
 {
  private DateTime _createTime ;
  public DateTime createTime
  {
   get
   {
    return _createTime ;
   }
   set
   {
    _createTime = value ;
   }
  }
  public void Save()
  {
  }
 }
}


using System;
namespace ClassLibrary1
{
 /// <summary>
 /// BasePage 的摘要说明。
 /// </summary>
 public class BasePage:System.Web.UI.Page
 {
  public BasePage()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  //保存文挡
  public void SaveDoc( IDoc _IDoc )
  {
   //实现从接口继承的文挡
   _IDoc.createTime = DateTime.Now ;
   _IDoc.Save() ;
  }
  //显示文挡
  public virtual void  ShowDoc()
  {
   
   //每个不同的文挡的显示,和具体的页面的UI元素是相关的,所以在这里不好控制
   //留到子类中进行控制
  }

 }
 //具体的页面
 public class ConcretePage:BasePage
 {
  public void Save()
  {
   concreteDoc1 doc1 = new concreteDoc1() ;
   SaveDoc( doc1 ) ; //inferface
  }
  public override void ShowDoc()
  {
   //具体实现显示文挡的代码
  }
 }
}

using System;
namespace ClassLibrary1
{
 /// <summary>
 /// doc 的摘要说明。
 /// </summary>
 public interface IDoc
 {
  
  DateTime createTime
  {
   get;
   set;
  }

  void Save();
 }
 //具体的文挡类
 public class concreteDoc1:IDoc
 {
  private DateTime _createTime ;
  public DateTime createTime
  {
   get
   {
    return _createTime ;
   }
   set
   {
    _createTime = value ;
   }
  }
  public void Save()
  {
  }
 }
}


using System;
namespace ClassLibrary1
{
 /// <summary>
 /// BasePage 的摘要说明。
 /// </summary>
 public class BasePage:System.Web.UI.Page
 {
  public BasePage()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  //保存文挡
  public void SaveDoc( IDoc _IDoc )
  {
   //实现从接口继承的文挡
   _IDoc.createTime = DateTime.Now ;
   _IDoc.Save() ;
  }
  //显示文挡
  public virtual void  ShowDoc()
  {
   
   //每个不同的文挡的显示,和具体的页面的UI元素是相关的,所以在这里不好控制
   //留到子类中进行控制
  }

 }
 //具体的页面
 public class ConcretePage:BasePage
 {
  public void Save()
  {
   concreteDoc1 doc1 = new concreteDoc1() ;
   SaveDoc( doc1 ) ; //inferface
  }
  public override void ShowDoc()
  {
   //具体实现显示文挡的代码
  }
 }
}

using System;
namespace ClassLibrary1
{
 /// <summary>
 /// doc 的摘要说明。
 /// </summary>
 public interface IDoc
 {
  
  DateTime createTime
  {
   get;
   set;
  }

  void Save();
 }
 //具体的文挡类
 public class concreteDoc1:IDoc
 {
  private DateTime _createTime ;
  public DateTime createTime
  {
   get
   {
    return _createTime ;
   }
   set
   {
    _createTime = value ;
   }
  }
  public void Save()
  {
  }
 }
}


using System;
namespace ClassLibrary1
{
 /// <summary>
 /// BasePage 的摘要说明。
 /// </summary>
 public class BasePage:System.Web.UI.Page
 {
  public BasePage()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  //保存文挡
  public void SaveDoc( IDoc _IDoc )
  {
   //实现从接口继承的文挡
   _IDoc.createTime = DateTime.Now ;
   _IDoc.Save() ;
  }
  //显示文挡
  public virtual void  ShowDoc()
  {
   
   //每个不同的文挡的显示,和具体的页面的UI元素是相关的,所以在这里不好控制
   //留到子类中进行控制
  }

 }
 //具体的页面
 public class ConcretePage:BasePage
 {
  public void Save()
  {
   concreteDoc1 doc1 = new concreteDoc1() ;
   SaveDoc( doc1 ) ; //inferface
  }
  public override void ShowDoc()
  {
   //具体实现显示文挡的代码
  }
 }
}


以上代码进行了这样的处理之后,也不知道是不是真的适用,凭感觉好象是用处不大,因为没有一个具体的文挡类,就会有一个具体的显示界

面类的,可能代码结构上清晰了一点了。
感觉如果是要做一个文挡管理器的话,抽象到文挡接口可能会有用一点,因为文挡管理器只关心文挡的创建时间、修改时间、创建人、文挡类

型等。


另外上面的代码中IDoc接口有一个createTime属性,但是interface是不允许实现主体的,所以实现属性的主体都放到了继承类来实现,实际上

在这里好象是不必要的,所以又想了用abstract class 来实现。
代码如下:

using System;
namespace ClassLibrary1
{
 /// <summary>
 /// doc 的摘要说明。
 /// </summary>
 public abstract class ADoc
 {
  private DateTime _createTime ;
  public DateTime createTime
  {
   get
   {
    return _createTime ;
   }
   set
   {
    _createTime = value ;
   }
  }
  public abstract void Save() ;
//  public virtual void Save()
//  {
//  }
 }

 //以下两个具体的文挡类
 public class concreteDoc2:ADoc
 {
  public override void Save()
  {
  }
 }
}


using System;
namespace ClassLibrary1
{
 /// <summary>
 /// BasePage 的摘要说明。
 /// </summary>
 public class BasePage:System.Web.UI.Page
 {
  public BasePage()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  //保存文挡
  public void SaveDoc( ADoc _ADoc )
  {
   //实现从abstract class继承的文挡
   _ADoc.createTime = DateTime.Now ;
   _ADoc.Save() ;
  }
  //显示文挡
  public virtual void  ShowDoc()
  {
   //每个不同的文挡的显示,和具体的页面的UI元素是相关的,所以在这里不好控制
   //留到子类中进行控制
  }
 }
 //具体的页面
 public class ConcretePage:BasePage
 {
  public void Save()
  {
   concreteDoc2 doc2 = new concreteDoc2() ;
   SaveDoc( doc2 ) ; //abstract class
  }
  public override void ShowDoc()
  {
   //具体实现显示文挡的代码
  }
 }
}


这样可以看到具体文挡类的实现不需要来控制属性的主体了。

using System;
namespace ClassLibrary1
{
 /// <summary>
 /// doc 的摘要说明。
 /// </summary>
 public abstract class ADoc
 {
  private DateTime _createTime ;
  public DateTime createTime
  {
   get
   {
    return _createTime ;
   }
   set
   {
    _createTime = value ;
   }
  }
  public abstract void Save() ;
//  public virtual void Save()
//  {
//  }
 }

 //以下两个具体的文挡类
 public class concreteDoc2:ADoc
 {
  public override void Save()
  {
  }
 }
}


using System;
namespace ClassLibrary1
{
 /// <summary>
 /// BasePage 的摘要说明。
 /// </summary>
 public class BasePage:System.Web.UI.Page
 {
  public BasePage()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  //保存文挡
  public void SaveDoc( ADoc _ADoc )
  {
   //实现从abstract class继承的文挡
   _ADoc.createTime = DateTime.Now ;
   _ADoc.Save() ;
  }
  //显示文挡
  public virtual void  ShowDoc()
  {
   //每个不同的文挡的显示,和具体的页面的UI元素是相关的,所以在这里不好控制
   //留到子类中进行控制
  }
 }
 //具体的页面
 public class ConcretePage:BasePage
 {
  public void Save()
  {
   concreteDoc2 doc2 = new concreteDoc2() ;
   SaveDoc( doc2 ) ; //abstract class
  }
  public override void ShowDoc()
  {
   //具体实现显示文挡的代码
  }
 }
}


这样可以看到具体文挡类的实现不需要来控制属性的主体了。

using System;
namespace ClassLibrary1
{
 /// <summary>
 /// doc 的摘要说明。
 /// </summary>
 public abstract class ADoc
 {
  private DateTime _createTime ;
  public DateTime createTime
  {
   get
   {
    return _createTime ;
   }
   set
   {
    _createTime = value ;
   }
  }
  public abstract void Save() ;
//  public virtual void Save()
//  {
//  }
 }

 //以下两个具体的文挡类
 public class concreteDoc2:ADoc
 {
  public override void Save()
  {
  }
 }
}


using System;
namespace ClassLibrary1
{
 /// <summary>
 /// BasePage 的摘要说明。
 /// </summary>
 public class BasePage:System.Web.UI.Page
 {
  public BasePage()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  //保存文挡
  public void SaveDoc( ADoc _ADoc )
  {
   //实现从abstract class继承的文挡
   _ADoc.createTime = DateTime.Now ;
   _ADoc.Save() ;
  }
  //显示文挡
  public virtual void  ShowDoc()
  {
   //每个不同的文挡的显示,和具体的页面的UI元素是相关的,所以在这里不好控制
   //留到子类中进行控制
  }
 }
 //具体的页面
 public class ConcretePage:BasePage
 {
  public void Save()
  {
   concreteDoc2 doc2 = new concreteDoc2() ;
   SaveDoc( doc2 ) ; //abstract class
  }
  public override void ShowDoc()
  {
   //具体实现显示文挡的代码
  }
 }
}


这样可以看到具体文挡类的实现不需要来控制属性的主体了。


另:
觉得在使用的时候
纯abstract类和interface差不多;
纯virtual函数和abstract函数差不多;

完整代码

*******************************************************************************

using System;

namespace ClassLibrary1
{
 /// <summary>
 /// BasePage 的摘要说明。
 /// </summary>
 public class BasePage:System.Web.UI.Page
 {
  public BasePage()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  //保存文挡
  public void SaveDoc( IDoc _IDoc )
  {
   //实现从接口继承的文挡
   _IDoc.createTime = DateTime.Now ;
   _IDoc.Save() ;
  }
  public void SaveDoc( ADoc _ADoc )
  {
   //实现从abstract class继承的文挡
   _ADoc.createTime = DateTime.Now ;
   _ADoc.Save() ;
  }
  //显示文挡
  public virtual void  ShowDoc()
  {
   
   //每个不同的文挡的显示,和具体的页面的UI元素是相关的,所以在这里不好控制
   //留到子类中进行控制
  }

 }
 //具体的页面
 public class ConcretePage:BasePage
 {
  public void Save()
  {
   concreteDoc1 doc1 = new concreteDoc1() ;
   concreteDoc2 doc2 = new concreteDoc2() ;
   SaveDoc( doc1 ) ; //inferface
   SaveDoc( doc2 ) ; //abstract class
  }
  public override void ShowDoc()
  {
   //具体实现显示文挡的代码
  }
 }
}

using System;

namespace ClassLibrary1
{
 /// <summary>
 /// doc 的摘要说明。
 /// </summary>
 public interface IDoc
 {
  
  DateTime createTime
  {
   get;
   set;
  }

  void Save();
 }
 public abstract class ADoc
 {
  private DateTime _createTime ;
  public DateTime createTime
  {
   get
   {
    return _createTime ;
   }
   set
   {
    _createTime = value ;
   }
  }
  public abstract void Save() ;
//  public virtual void Save()
//  {
//  }
 }

 //以下两个具体的文挡类
 public class concreteDoc1:IDoc
 {
  private DateTime _createTime ;
  public DateTime createTime
  {
   get
   {
    return _createTime ;
   }
   set
   {
    _createTime = value ;
   }
  }
  public void Save()
  {
  }
 }
 public class concreteDoc2:ADoc
 {
  public override void Save()
  {
  }
 }
}

原创粉丝点击