继承(1)-- C#系统学习

1.1  C#继承分为:实现继承接口继承

  实现继承:一个类型派生于一个基类型,拥有该基类型的所有属性和方法。在实现继承中,派生类型中的每个函数采用基类型的实现代码,除非重写基类型的方法。

    如下例:

   public class Base 
    {
        public string sName;
        public string Fun() 
        {
            return "";
        }
    }

    public class Son : Base
    {
        
    }

类Son就拥有类Base中的sName属性和Fun方法。
  接口继承:表示一个类型只继承了函数的签名,没有继承函数的任何代码。

    例如:

  

   public interface IDisposable
    {
        // 摘要:
        //     执行与释放或重置非托管资源相关的应用程序定义的任务。
        void Dispose();
    }

    class Son:IDisposable
    {
    }

 接口继承常常被看作提供了一种契约:让类型派生于接口,来保证为客户提供某个功能。

1.2 多重继承

      C#不支持多重实现继承。但是C#允许继承多个接口。

1.3 结构和类

      结构不支持继承,结构派生于System.ValueType。

      结构不支持实现继承,但支持接口继承。

  可总结为:

            结构总是派生于System.ValueType,他们还可以派生于任意多个接口。

            类总是派生于用户选择的另一个类,他们还可以派生于任意多个接口。

2.1 虚方法(Virtual)

      把一个基类函数声明为Virtual,该函数就可以在派生类中重写了。

class BaseClass 
    {
        public virtual string VirtualMethod() 
        {
            return "定义";
        }
    }

    class DerivedClass : BaseClass 
    {
        public override string VirtualMethod()
        {
            return "重新定义";
        }
    }

注意 :成员字段和静态函数不能使用virtual,因为virtual只对类中的实例函数有意义。
2.2 隐藏方法

      如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual和override,那么派生类方法就会隐藏基类的方法。

      在编译的代码的时候,系统会发出警告,但是不会报错。 如果要消除警告,可以在派生类中的方法中使用 new 关键字,例如:

    

   class BaseClass
   {
        public int Fun()
        { 
            return 0;
         }
   }


    class DerivedClass : BaseClass 
    {
        public new int Fun()
        {
            return 0;
        }
    }

2.3调用函数的基类版本

     从派生类中调用方法的基类版本的方法是:base.<MethodName>()。

     例如:假定派生类中的一个方法要返回基类的方法返回的值得90%。

 

class CustomerAccount 
    {
        public virtual decimal CalcPrice() 
        {
            return 0.0M;
        }
    }

    class GoldAccount : CustomerAccount 
    {
        public override decimal CalcPrice()
        {
            return base.CalcPrice() * 0.9M;
        }
    }

2.4抽象类和抽象函数(abstract)
     抽象类不能被实例化,抽象函数没有执行代码,必须在非抽象的派生类中重写。如果类中包含抽象函数,那么该类也将是抽象类

2.5 密封类和密封方法(sealed)

      一般很少用,除非业务上需要,比如,禁止第三方以违反注册协议的方式扩展该类,其实密封类随处可见,string就是一个密封类,可以点击F12去查看string类的定义,就会发现是sealed的定义。

      建议:尽量少用

 

  

 

 

 

  

posted @ 2012-08-22 23:42  猕猴桃  阅读(165)  评论(0)    收藏  举报