多态的应用

最近在写学校的SRTP项目--学生信息管理系统,其中涉及到对以下信息的数据库操作。当然持久化之前要对数据的合法性进行验证,如果非法要提示合理信息,如果有其他问题会抛出异常。

这些信息几乎按种来分类,每类一个数据表,也就是一类实体,除了各个实体属性不同其余操作就相差不大了。那么怎样来对这些信息进行统一的操作呢?这里就用到了多态。下面就用我的实现来作为例子吧,如果大家有什么好的想法可以提出来,不对的地方希望大家指出。谢谢,呵呵!

涉及到信息:

1.基本信息:学号,姓名,班级,专业,年龄,身份证号,籍贯等

2.家庭信息:家庭住址,家庭电话,家庭成员信息等

3.奖学金信息:包括获得奖学金的数额,时间,项目等

4.活动信息:参加的活动,活动举行的时间,活动的结果等

5.资助信息:资助的项目,资助金额,资助时间等

6.处分信息:处分的时间,原因,是否被撤销等

7.素质测评信息:包括测评的时间,文体,时间等的得分情况

8.参加的比赛信息:包括比赛名称,时间,结果等

实现概括:

每类信息的添加,修改都有一个专门的VIEW,也就是一个WinForm,他们共同继承Form_base,base处理共同问题,具体问题子类各自处理

From_Base实现:

Code

1using System;
   2using System.Collections.Generic;
   3using System.ComponentModel;
   4using System.Data;
   5using System.Drawing;
   6using System.Linq;
   7using System.Text;
   8using System.Windows.Forms;
   9
  10using StudentManagerV3.DataBase;
  11
  12namespace StudentManagerV3
  13{
  14    public partial class Form_Base : Form
  15    {
  16        private StudentManagerDataContext context;
  17        private bool isEidt = false;
  18        /**//// <summary>
  19        /// 视图的引用,当模型发生改变时更新视图,呈献给用户新结果
  20        /// </summary> 
  21        protected DataGridView GridView { get; set; }
  22
  23        /**//// <summary>
  24        /// 如果是编辑信息,实体不为空,强制转换成用户需要的实体
  25        /// </summary>
  26        protected object Entity { get; set; }
  27
  28        /**//// <summary>
  29        /// 每个Form都单独维护自己的一个Context,防止产生冲突或者引发错误
  30        /// </summary>
  31        protected StudentManagerDataContext Context
  32        {
  33            get
  34            {
  35                if (context == null) throw new ArgumentNullException();
  36                return context;
  37            }
  38        }
  39
  40        /**//// <summary>
  41        /// 标识是编辑信息还是添加新信息,
  42        /// </summary>
  43        protected bool IsEdit { get { return isEidt; } }
  44
  45        public Form_Base()
  46        { }
  47
  48        public Form_Base(object entity)
  49        {
  50            if (entity != null) { isEidt = true; this.Entity = entity; }
  51            //AppInfo包含了系统的配置信息
  52            context = new StudentManagerDataContext(AppInfo.ConnectionString);
  53        }
  54
  55        //判断当前操作的实体是否有效
  56        protected bool ISLegal()
  57        {
  58            //全局信息,标识当前实体
  59            return DataPool.StudentNumber != "0";
  60        }
  61
  62        public void ShowHandleEntityError(string message)
  63        {
  64            if (message != null)
  65                SMSApplication.WriteLogAndShowSuggestiveInfo(message,
  66                    SysConfig.Document.SelectNodes(XmlSelectorInfo.ApplicationError)[0].InnerText);
  67            else SMSApplication.WriteLogAndShowSuggestiveInfo(message,
  68                SysConfig.Document.SelectNodes(XmlSelectorInfo.EntityError)[0].InnerText);
  69        }
  70
  71        /**//// <summary>
  72        /// 添加,修改学生信息(除基本信息)的逻辑,统一处理(多态的实现)
  73        /// </summary>
  74        protected void AddOrEditInfo()
  75        {
  76            try
  77            {
  78                if (ISLegal())
  79                {
  80                    ConstructEntityInfo();
  81                    SMSApplication.ShowOperateSucceedResult();
  82                }
  83                else ShowHandleEntityError(null); ;
  84            }
  85            catch (FormatException exp)
  86            {
  87                //SMSApplication系统写入日志和显示友好信息的组件,XmlSelectorInfo记录xml配置文件寻址信息
  88                SMSApplication.WriteLogAndShowSuggestiveInfo(exp.Message, SysConfig.Document.SelectNodes(XmlSelectorInfo.FormatError)[0].InnerText);
  89            }
  90            catch (OverflowException exo)
  91            {
  92                SMSApplication.WriteLogAndShowSuggestiveInfo(exo.Message, SysConfig.Document.SelectNodes(XmlSelectorInfo.OverFlowError)[0].InnerText);
  93            }
  94            catch (Exception ex)
  95            {
  96                ShowHandleEntityError(ex.Message);
  97            }
  98            this.Dispose();
  99        }
100        /**//// <summary>
101        /// 获得新信息实体的方法,由子类实现
102        /// </summary>
103        protected virtual void ConstructEntityInfo()
104        {
105            throw new NotImplementedException();
106        }
107
108    }
109}
110

时间: 2024-09-30 17:06:12

多态的应用的相关文章

C#多态小结——面向对象编程的三大机制之二

C#的多态性: 我的理解是:同一个操作,作用于不同的对象时,会有不同的结果,即同一个方法根据需要,作用于不同的对象时,会有不同的实现. C#的多态包括:接口多态,继承多态. 其中继承多态又包括通过虚拟方法实现的多态和通过抽象方法实现的多态性 例如:基类动物都有吃的方法,但是不同的动物吃的东西就会不一样,例如狼吃肉,羊吃草,这样"吃"的这个方法就要在派生类里面重新实现以下,运行时,通过指向基类的指针,来调用实现派生类中的方法. 接下来举例实现多态性. 1. 接口多态性 把动物"

Python编程之多态用法实例详解

  本文实例讲述了Python编程之多态用法.分享给大家供大家参考.具体分析如下: 什么是多态?顾名思义,多态就是多种表现形态的意思.它是一种机制.一种能力,而非某个关键字.它在类的继承中得以实现,在类的方法调用中得以体现.多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式. 我们先看一个简单的例子,运算符多态: ? 1 2 3 4 5 6 a=34 b=57 print(a+b) a="世界" b="你好" print(a+b) 我们不知

JAVA多态示例

1 class SuperClass 2 { 3 public void test() 4 { 5 System.out.println("SuperClass"); 6 } 7 } 8 class SubClass1 extends SuperClass 9 { 10 public void test() 11 { 12 System.out.println("SubClass1"); 13 } 14 } 15 class SubClass2 extends Su

javascript面向对象中多态和泛型的关系

在大家看到我的这篇文章时,我正在拜读刘未鹏先生写的<暗时间>,如果你有幸看到我的这篇博客,我希望你也可以看看这本书.好了闲话少叙,进入正题. 在面向对象的Collection中处处体现泛型和多态的思想,且慢,由于泛型和多态两者之间本身就有一定的相似性,让我们先认清楚泛型和多态之后再进入话题. 多态是面向对象最基本的概念之一,即要模糊父类和之类之间的区别,如何模糊呢?我们再来举网络上的那个例子: class Aninal{ 叫:}//叫是动物的一个方法 class 猫 extend Animal

小心重写方法,正确实现多态

这是我今天在工作中碰到的问题,是关于继承和多态的.同事对项目中的一项基础功能进行了重构,可是当我们从CVS服务器上更新了项目源代码并编译了之后,发现这项功能已不能正常工作了.先撇开这个同事所犯的错误(对代码进行重构后没有测试他的新代码就上传到了CVS服务器上)不说,在这里我就说说这个问题所带出来的JAVA konwhow.由于我们的项目比较复杂,我在这里采取比较简单的例子来讲解这个问题.首先,我们有2个类:supper.TestSupper.java 和sub.TestSub.java.他们的代

漫谈C#编程中的多态与new关键字

编程|关键字 1. 你通常怎样用多态? 假设我有一个类,里面有一个 PrintStatus 方法,用于打印实例的当前状态,我希望该类的派生类都带有一个 PrintStatus 方法,并且这些方法都用于打印其实例的当前状态.那么我会这样表达我的愿望: // Code #01 class Base{ public virtual void PrintStatus() { Console.WriteLine("public virtual void PrintStatus() in Base"

《Java编程思想》(第二版)第7章:多态(polymorphism)

编程 封装,继承与多态是OOP的三个核心本质. Method-call(函数调用)绑定方式:如果绑定动作发生于程序执行前(由编译器和连接器完成),成为"先期绑定(early binding)"绑定动作将在执行期才根据对象型别尔进行,称为后期绑定late binding,或者执行期绑定run-time binding,或者动态绑定dynamic binding.Java运用RTTI(run-time type identification)技术来支持动态绑定. 上一章提到的final关键

vb.net类的封装,继承,多态,抽象之一

封装|继承   封装就是把各种方法和变量合并到一个类,用这个类代表某个对象为完成一定的任务所能保存的范围以及它能执行的操作. 继承就是根据现有类的方法和成员变量生成新的类的功能 多态就是对象随着程序执行而使其形式发生改变的能力. 抽象就是在暂时忽略对象的具体细节的功能. 在类中,构造器的方法使简化类的成员变量的初始化处理,当用继承从一个类构造另一个类的时候,会有两套构造器发生作用,即基类构造器和派生类构造器 例如: Public Class Form1    Inherits System.Wi

ASP.NET入门随想之多态、接口与委托

asp.net     曾几何时,我们居住的陆地沉睡在海底,大陆也紧密的联系在一起,千百年过去了七大洲的地壳板块在缓缓移动,喜马拉雅山在慢慢增高,世界在变,唯一不变的是变化. ■ 软件开发的悖论 - 把变化变成计划 在软件开发活动的过程中,常被一个悖论所缠绕:不写码就搞不清该做什么:搞不清做什么又不知道该如何写码. 人的思维是很随意的东西,不同的人,或同一个人的不同阶段,对同一件事情的看法都会有差异,可谓是远看成岭侧成峰,远近高低各不同.随意再加上变化,常常引起项目流产或工期大大拖延. 之所以会

C++:显示接口&amp;amp;运行期多态 和 隐式接口&amp;amp;编译期多态

类(class)和面向对象: 显示接口(explicit interface): 即在源代码中可见, 可以在头文件内看到类的所有接口; 运行期多态(runtime polymorphism):成员函数是virtual, 传入类的引用或指针时, 在运行时, 会自动匹配接口, 可能是基类的接口, 也可能是派生类的; 模板(templates)和泛型编程(generic programming): 隐式接口(implicit interface):typename T, 在函数中, 所必须支持一组操作