C#之封装和继承

       万丈高楼平地起,勿在浮沙筑高台。不知道是不是由于之前VB基础没打好的原因,自从开到C#这就遇到了不少困难,当然了,困难虽然是暂时的,但总得去解决不是,只好通过不断地学习和总结来加深印象,夯实基础,争取厚积薄发。

        封装、继承和多态是面向对象的三大特性,因此从C#的角度对这三大特性进行一个简单总结。

       一、封装

      首先封装相信大家都不会陌生了吧,就像看电视一样,不需要知道电视是怎么搜索频道,怎么成像的,只要把电视当成娱乐的对象,知道怎么用就可以了,这就是面向对象中封装的特点,也就是说每个对象都包含它能进行操作所需要的所有信息。因此对象不必依赖其他对象来完成自己的操作。这样方法和属性包装在类中,通过类的实例来实现。

       封装的好处:

       1、良好的封装能够减少耦合

       2、类内部的实现可以自由地修改

       3、类具有清晰的对外接口

       下面通过两种方法来进行数据的封装:

      (一、)用传统的读、写方法封装

public class cat
    {
        private string name;
        public string Getname()  //读方法
        {
            return name;
        }
        public void Setname(string aa)  //写方法
        {
            name = aa;
        }
        static void Main(string[] args)
        {
        cat a = new cat();  //将cat类实例化
        a.Setname("咪咪");
        Console.WriteLine(a.Getname());
        }
    }
       通过读写的方法可以保护私有数据不被外部数据所破坏,上面例子中name的修饰符是private,只能通过读写的方法访问类cat的name

     (二、)用属性实现封装

 public class cat
    {
        private string name;
        public string Name  
        {
            get  //读
            {
                return name; 
            }
            set  //写
            {
                name=value;
            }
        }
    }
        public class catmain
        {
        public static int Main(string[]args)
        {
        cat a = new cat();  //将cat类实例化
        a.Name  ="咪咪";
        Console.WriteLine(a.Name);  //输出cat
        return 0;
        }
    }
        通过上面的例子,可以看出属性具有两种操作get和set,get用来返回属性域的值,set通过value这个变量来给属性域赋值。

       二、继承

       继承楚广明老师也解释的相当明白了,就像无论电视机如何发展,声音图像等基本功能是延续不变的,这在面向对象理论中就是继承。继承定义了类如何相互关联、共享特性,子类不但继承了父类的所有特性,还可以定义新的特性。但对于构造函数,它不能被继承,只能被调用。

       继承的优点:继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,避免了重复,同时,继承使修改或扩展继承而来的实现较为容易。

public class Person  //定义Person类
    {
        string _name;
        public string Name  //定义name属性
        {
            get { return _name; }
            set { _name = value; }
        }
        int _age;
        public int Age  //定义Age属性
        {
            get { return _age; }
            set { _age = value; }
        }
        public void show()  //定义方法
        {
            Console.WriteLine("这是人");
        }
    }
    public class Student:Person   //Student类继承Person类
    {
        public void sayhi()  //Student类的方法
        {
            Console.WriteLine("我是学生,我叫{0},{1}岁了",this.Name ,this.Age );
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //Person p = new Person();
            Student s = new Student();  //实例化Student类
            s.Name = "旺旺";
            s.Age = 20;
            s.sayhi();
        }
    }

      上面的例子中Student子类继承了Person父类的name和age属性以及show方法,同时Student类还可以定义自己的方法属性,这实现了子类对父类的继承。

      对于构造函数,则只能被调用,而不能继承,可以使用base关键字调用基类的构造函数。

    public class Person
    {
        public string _name;
        public int _age;
        public Person(string name, int age)  //构造函数
        {
            this._name = name;
            this._age = age;
        }
    }
    public class Student : Person
    {
        private int _id;
        public Student(string name, int age, int id)
            : base(name, age)  //调用Person类的构造函数
        {
            this._id = id;
            Console.WriteLine(_id);  //Student类方法
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Student objStudent = new Student("旺旺", 20, 1);
        }
    }

      C#中类的继承需要遵循以下原则:

      1、派生类只能继承于一个基类

      2、派生类自然继承基类的成员,但不能继承基类的构造函数成员

      3、类的继承可以传递

      4、派生类湿度基类的扩展,但不能消除已继承的基类成员

      5、派生类中如果声明了与基类同名的成员,基类的同名成员会被覆盖,从而不能直接访问同名的基类成员

      6、基类可以定义虚方法成员等,这样派生类能够重载这些成员表现出类的多态性

     三、多态

     其实本篇文章应把多态总结上的,但由于多态涉及到了虚方法、重载和覆写等,所以就总结在下篇博客中吧。



版权声明:本文为zm13722251407原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。