月度归档:2017年02月

c# 抽象类 接口


简介

抽象类和接口在c#编程中,主要作用为类提供一个抽象机制,
由于c#具有这种机制,才使得c#具有面向对象的能力。
由于使用抽象类和接口,我们才能更好的 封装、优雅的继承类和接口,使类具有多态的功能


定义方式


抽象类和接口类所定义采用的关键字不同

   abstract定义类
   public abstract class newBaseClass{
        public abstract void fun1();
        public abstract void fun2();
   } 
 
   interface定义类
   
   public interface  newIBaseClass{
        void fun1();
	void fun2();
   }
 


共同点

abstract 和 interface都可以对继承的对象限制其行为,
interface是abstract的一种特殊形式。
abstract 和 interface都不可以进行实例化。


不同点

1 abstract 可以被类继承,但不能被interface继承
interface既可以被类继承,也可以被interface继承
2 一个类只能继承一个abstract类,但可以继承多个interface接口
3 abstract可以添加一个数据类型,构造函数,普通方法,达到类的默认行为实现
interface不可以实现任何操作,只能作为 “行为约束的定义”,即接口中不可以定义变量,
不可以定义实现方法,只能定义抽象方法

4 abstract主要体现继承属性(主要对一类相同事物进行定义),
interface主要应用于能力行为的控制



应用场景

当我们设置一个类时,我们需要从类和接口的不同点上分析和斟酌使用类还是接口
进行类的定义。

如果想定义一些基础方法, 并需要设置默认实现,需使用抽象类
如果涉及多继承,需要使用接口

例:
我们需设计一个数据库操作类,支持MSSQL Oracle MySql …
由于这些类属于一类对象 is 数据库对象,都具有基本功能 CRUD
针对这种情况我们首先 需定义一个抽象类,然后所有数据库操作都继承这个抽象类,实现基本功能,
达到数据库的基本操作功能。

 
  public abstract class DbOperBase{
      abstract void   getConn();
      abstract string insert();
      abstract string update();
      abstract string delete();
      abstract string search();
  }

  ----MSSQL操作类
  public class MssqlDbOper:DbOperBase
  {
      void   getConn(){
          ...
      }
      string insert(){
          ...
      }
      string update(){
          ...
      }
      string delete(){
          ...
      }
      string search(){
          ...
      }
  }

  ----Oracle 操作类

  public class OracleDbOper:DbOperBase
  {
      void   getConn(){
          ...
      }
      string insert(){
          ...
      }
      string update(){
          ...
      }
      string delete(){
          ...
      }
      string search(){
          ...
      }
  }

  ----Mysql操作类
  public class MysqlDbOper:DbOperBase
  {
      void   getConn(){
          ...
      }
      string insert(){
          ...
      }
      string update(){
          ...
      }
      string delete(){
          ...
      }
      string search(){
          ...
      }
  }

——….

例:oracle有内存数据库,具有内存数据库的操作方式,那么我们将为oracle单据定义一些接口

public Interface IMemStore
{
    string memInsert();
}



  ----改写Oracle 操作类

  public class OracleDbOper:DbOperBase:IMemStore
  {
      void   getConn(){
          ...
      }
      string insert(){
          ...
      }
      string update(){
          ...
      }
      string delete(){
          ...
      }
      string search(){
          ...
      }
  
      string memInsert(){
          ...
      }
  }

窥探MVC中action返回类型


一、返回类型的简介

MVC 默认返回类型都基于ActionResult抽象类,继承而来。

MVC Action方法返回类型存在一个共同点,最终都是通过respone.write(“输出信息”),反馈给浏览器

MVC框架提供默认以下几种Action返回类型

类型名

功能
ActionResult

基础类型-可以返回任意继承此类的新类型
FileResult

输出二进制,response的编码方式为二进制
JavaScriptResult

返回一个javascript脚本,并且客户端可以进行执行操作
RedirectResult

重定向到一个新的URL地址进行访问
ContentResult

返回用户定义的内容文件
EmptyResult

返回一个空给客户端
FileContentResult

返回文件内容给客户端
HttpStatusCodeResult

返回http状态码
HttpNotFoundResult

返回http没有发现页面的提示信息
HttpUnauthorizedResult

返回没有授权提示
FilePathResult

返回文件路径
JsonResult

返回JSON对象
FileStreamResult

返回文件流对象
ViewResult

返回一个web页面
RedirectToRouteResult

根据路由规则重定向系统访问
PartialViewResult

返回部分视图,常用于控件操作

mvc-actionResult


二、返回类型原理简介

actionResult类简介

actionResult抽象类,包含一个方法 ExecuteResult ,继承此类,只需实现此方法即可


 	public abstract class ActionResult
	{
		public abstract void ExecuteResult(ControllerContext context);
	}

ContentResult类简介


 
  public class ContentResult : ActionResult
	{
		public string Content
		{
			get;
			set;
		}

		public Encoding ContentEncoding
		{
			get;
			set;
		}

		public string ContentType
		{
			get;
			set;
		}

		public override void ExecuteResult(ControllerContext context)
		{
			if (context == null)
			{
				throw new ArgumentNullException("context");
			}
			HttpResponseBase response = context.HttpContext.Response;
			if (!string.IsNullOrEmpty(this.ContentType))
			{
				response.ContentType = this.ContentType;
			}
			if (this.ContentEncoding != null)
			{
				response.ContentEncoding = this.ContentEncoding;
			}
			if (this.Content != null)
			{
				response.Write(this.Content);
			}
		}
	}

通过contentResult类,我们可以看出actionResult的最终结果就是采用response.write 输出html至客户端。


三、自定义MVC返回类型

   #region 自定义actionResult

    public class newActionResult : ActionResult
    {


        private string   Content_;
        public string Content {
            get { return Content_; }
            set { Content_ = value; }
        }

        public newActionResult(string s)
        {
            Content_ = s;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            HttpResponseBase response = context.HttpContext.Response;
            response.Write(this.Content); 
        }
    }

    #endregion 


    //----------调用方法

       public newActionResult roleTestInfo()
        {
            return new newActionResult("这是一个自定义actionResult");
        }

c# enum简介


一、enum数据类型简介

enum 是一种数据类型, 在c#中,为值类型,主要对一些限定特定范围的变量使用。
enum类型是常量,初始化定义后,不可以进行修改赋值操作。
enum 是一批相同类型已知常量的组合而成,常量不可以为空
enum 可以包含以下数据类型:
byte sbyte short ushort int uint long ulong

例:星期一 星期二 星期三 。。。
性别: 男 女
web表单提交方式:POST GET


二、enum数据类型应用

定义方法

public enum sex
{
    male,
    female
}

public enum sex2
{
    male=10,
    female
}

public enum sex3
{
    male=10,
    female =15
}


例:枚举类型sex, 未进行sex赋值操作
第一个枚举数的值为0,后续枚举值依次加1


枚举类型sex2,第一个枚举数的值为10,后续枚举值依次加1


枚举类型sex3,第一个枚举数的值为10,第二个枚举值为15



using System;
public class enumInfo
{
     enum sex{male=10,female};
     static void Main()
     {
         int a = (int)sex.male;
	 int b = (int)sex.female;
	 Console.WriteLine("male={0}",a);
	 Console.WriteLine("female={0}",b);
     }
}

输出:
male   = 10
female = 11