e心e意

导航

C#类和继承(扩展方法、静态类、抽象类、构造函数初始化等)

分部类和分部方法

namespace jiayou1
{
    /*定义分部类需要注意以下问题:在申明
     和实现申明中都必须包含上下文关键字partial,直接放在
     关键字void的后面,返回类型必须是void
     参数列表不能包含out参数*/
    partial class MyClass
    {
        partial void PrintSum(int x,int y);
        //申明分部方法,没有实现部分
        public void Add(int x,int y)
    {
        PrintSum(x,y);
    }
    }
    partial class MyClass
    {
        partial void PrintSum(int x, int y)
            //申明分部方法,实现部分
        {
            Console.WriteLine("sum is {0}",x+y);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var mc = new MyClass();
            mc.Add(5,6);
        }
    }
}

类继承

namespace 类继承
{
    class SomeClass//基类
    {
        public string Field1 = "base class field";
        public void Method1(string value)
        {
            Console.WriteLine("base class--Method1:{0}",value );
        }
    }
    class OtherClass : SomeClass//派生类
    {
        public string Field2 = "derived class field";
        public void Method2(string value)
        {
            Console.WriteLine("Derived class--Method2:{0}",value);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            OtherClass oc = new OtherClass();
            oc.Method1(oc.Field1 );//以基类字段为参数的基类方法
            oc.Method2(oc.Field2);//以基类字段为参数的基类方法
            oc.Method1(oc.Field2);//以基类字段为参数的基类方法
            oc.Method2(oc.Field1);//以基类字段为参数的基类方法
        }
    }
}

隐藏基类成员

namespace 隐藏基类的成员
{
    /*要隐藏一个继承的数据成员,需要声明一个新的new相同的
     类型成员,并使用相同的名称
     要让编译器知道你在故意隐藏继承成员,使用New修饰符。
     没有它,程序可以成功编译,但编译器会警告你隐藏了
     一个继承的成员*/
    class SomeClass//基类
    {
        public string Field1 = "SomeClass Field1";
        public void Method1(string value)
        {
            Console.WriteLine("SomeClass.Method1:{0}",value);
        }
    }
    class OtherClass : SomeClass//派生类
    {
        new public string Field1 = "OtherClass Field1";//掩盖基类成员
        new public void Method1(string value)//掩盖基类成员
        {
            Console.WriteLine("OtherClass.Method1:{0}", value);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            OtherClass oc = new OtherClass();//使用掩盖成员
            oc.Method1(oc.Field1 );//使用掩盖成员
        }
    }
}

基类访问

namespace 基类访问
{
    class SomeClass//基类
    {
        public string Field1 = "Field1--In the base class";
    }
    class OtherClass : SomeClass//派生类
    {
        new public string Field1 = "Field1--In the base class";//隐藏基类中的字段
        public void PrintField1()
        {
            Console.WriteLine(Field1 );//访问派生类
            Console.WriteLine(base.Field1 );//访问基类,运用base
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            OtherClass oc = new OtherClass();
            oc.PrintField1();
        }
    }
}

使用基类引用

namespace 使用基类的引用
{
    class MyBaseClass
    {
        public void Print()
        {
            Console.WriteLine("This is the base class.");
        }
    }
    class MyDerivedClass : MyBaseClass
    {
        new public void Print()
        {
            Console.WriteLine("This is the derived class");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDerivedClass derived = new MyDerivedClass();
            MyBaseClass mybc = (MyBaseClass)derived;//转换成基类
            derived.Print();//从派生类部分调用Print
            mybc.Print();//从基类部分调用Print
        }
    }
}

虚方法和覆写方法

namespace 虚方法和覆写方法
{
    /*基类的方法被标记为virtual,在派生类中有匹配的override
     覆写方法和被覆写方法须有相同的可访问性。不能有关键词
     private出现,不能覆写static方法或非虚方法。*/
    class MyBaseClass
    {
        virtual public void Print()//虚方法
        {
            Console.WriteLine("This is the base class.");
        }
    }
    class MyDerivedClass : MyBaseClass
    {
        override public void Print()//覆写方法
        {
            Console.WriteLine("This is the derived class.");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDerivedClass derived = new MyDerivedClass();
            MyBaseClass mybc = (MyBaseClass)derived;//强制转换为基类
            derived.Print();
            mybc.Print();
        }
    }
}

构造函数初始化语句

namespace 构造函数的初始化语句
{
    class MyClass
    {
        readonly int firstVar;
        readonly double secondVar;
        //readonly字段只可以在构造函数中初始化
        public string UserName;
        public int UserIdNumber;
        private MyClass()
            //私有的构造函数进行其他
            //构造函数共同初始化
        {
            firstVar = 20;
            secondVar = 30.5;
        }
        public MyClass(string firstName)
            : this()//使用构造函数初始化语句
        {
            UserName = firstName;
            UserIdNumber = -1;
        }
        public MyClass(int idNumber)
            : this()//使用构造函数初始化语句
        {
            UserName = "Anonymous";
            UserIdNumber = idNumber;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

        }
    }
}

程序集间的继承【包括(1)和(2)】

(1)

namespace BaseClassNS
{
    public class MyBaseClass
    //该声明为公有的,以使他能被从程序集的外部看见
    {
        public void PrintMe()
        {
            Console.WriteLine("I am MyBaseClass");
        }
    }
}

(2)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BaseClassNS;
//包含基类申明的命名空间

namespace 程序集继承2
{
    class DerivedClass:MyBaseClass  
        //在其他程序集中的基类
    { 
    
    }
    class Program
    {
        static void Main(string[] args)
        {
            DerivedClass mdc = new DerivedClass();
            mdc.PrintMe();
        }
    }
}

抽象类和抽象方法

namespace 抽象类和抽象方法1
{
    abstract class ABClass//抽象类声明
    {
        public void IdentifyBase()//普通方法
        {
            Console.WriteLine("I am ABClass");
        }
        abstract public void IdentifyDerived();//抽象方法
    }
    class DerivedClass : ABClass//派生类
    {
        public override void IdentifyDerived()//抽象方法实现
        {
            Console.WriteLine("I am DerivedClass");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //ABClass a=new ABClass();错误:抽象类不能实例化
            //a.IdentifyBase();
            DerivedClass b = new DerivedClass();//实例化派生类
            b.IdentifyBase();//调用继承方法
        }
    }
}

另一个抽象类例子

namespace 抽象类2
{
    abstract class MyBase//抽象和非抽象成员的组合
    {
        public int SideLength = 10;//数据成员
        const int TriangleSideCount = 3;//数据成员
        abstract public void PrintStuff(string s);//抽象方法
        abstract public int MyInt { get; set; }//抽象属性
        public int PerimeterLength()//普通非抽象方法
        {
            return TriangleSideCount * SideLength;
        }
    }
    class MyClass : MyBase
    {
        public override void PrintStuff(string s)//覆盖抽象方法
        {
            Console.WriteLine(s);
        }
        private int   _MyInt;
        public override int  MyInt//覆盖抽象属性
{
      get 
    { 
        return _MyInt;
    }
      set 
    { 
        _MyInt=value ;
    }
}
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.PrintStuff("This is a string .");
            mc.MyInt = 28;
            Console.WriteLine(mc.MyInt );
            Console.WriteLine("Perimeter Length:{0}",mc.PerimeterLength ());
        }
    }
}

静态类

namespace 静态类
{
    /*类的本身必须标记static
     类的所有成员必须是静态的。
     类可以有一个静态构造函数,但没有实例构造函数
     不能创建该类的实例。静态类是隐式是封闭的,不能
     继承静态类。*/
    static public class MyMath
    {
        public static float PI = 3.14f;
        public static bool IsOdd(int x)
        {
            return x % 2 == 1;
        }
        public static int Times2(int x)
        {
            return 2 * x;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int val = 3;
            Console.WriteLine("{0} is odd is {1}",val,MyMath .IsOdd (val ));
            Console.WriteLine("{0}*2={1}.",val,MyMath .Times2 (val ));
        }
    }
}

扩展方法

namespace 声明扩展方法
{
    /*声明扩展方法必须声明为static
     扩展方法本身必须声明为static
     扩展方法必须包含关键字this作为他的一个参数类型
     并在后面跟着所扩展类的名称。*/
    sealed class MyData
    {
        private double D1, D2, D3;
        public MyData(double d1, double d2, double d3)
        {
            D1 = d1; D2 = d2; D3 = d3;
        }
        public double sum()
        {
            return D1 + D2 + D3;
        }
    }
    static class ExtendMyData//声明扩展方法
    {
        public static double Average(this MyData md)//this关键字和类型(相当于实例化)
        {
            return md.sum() / 3;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyData md = new MyData(3, 4, 5);
            Console.WriteLine("Sum:{0}",md.sum ());//当作实例化成员来调用
            Console.WriteLine("Average:{0}",md.Average ());
        }
    }
}

 

 

posted on 2014-05-15 19:53  e心e意  阅读(803)  评论(0)    收藏  举报