您的位置:首页 > 编程语言 > C#

C#——类和继承

2015-12-13 21:18 597 查看

前言

之前画的UMl图中接触到了类,但对类是什么,怎么创建,怎么调用没有清晰的认识。现在学习C#,这门面向对象语言,可算领略到了类的魅力。类很大程度上减少了代码的冗余,增加了代码的灵活性。

类的基础知识

(1)类和结构体的区别

1.class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。

2.struct属于值类型,是分派在内存的栈上的。结构体是复制传递的。Int32,boolean 等都属于结构体。

(2)类中包括字段,属性和方法

类的默认修饰符是internal,字段的默认属性是private.

(3)字段和属性的区别




字段是小写,属性的第一个字母是大写;

字段加上private在对象中访问不到

属性可分为读写(get,set),只读(get),只写(set)

例子

在看视频的时候,感觉这个例子非常有意思。给10个人随机分配角色,然后在执行角色对应的方法。看到这个题的时候,脑袋都大了。10个人,6各角色,基类和子类,随机,执行不同的方法。。根本没法弄啊。但是看完视频,自己敲完例子,感觉类真是太方便了。按照高内聚,低耦合的原则,把能独立的功能都抽出来形成类或方法,这样使代码变得灵活,提高了复用性。

[code]namespace 类_调用
{
    class Program
    {
        /// <summary>
        /// 主函数入口
        /// 生成6个类 分别是人,老师,学生,帅哥,美女,野兽 给10个人随机分配这6中角色并调用相应角色的方法
        /// 涉及到生成类,编写一个判断子类和父类转换的方法,随机数,数组的遍历,case条件结构
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //随机生成6个类
            //然后转换 调用这个类的方法
            Person[]Per = new Person [10];//实例化10个人放到一个数组里
            Random r = new Random();

            for (int i = 0; i < Per.Length;i++ )//遍历数组,为10个人分配角色
            {
                int num = r.Next(1,7);//生成1到6的随机数
                switch (num )//case 判断
                {
                    case 1: Per[i] = new Person(); break;
                    case 2: Per[i] = new Teacher(); break;
                    case 3: Per[i] = new Student();break;
                    case 4: Per[i] = new ShuaiGuo();break;
                    case 5: Per[i] = new MeiNv();break;
                    case 6: Per[i] = new YeShou(); break;

                }
            }
            //遍历数组,10个人执行对应角色的方法
            for (int i = 0; i < Per.Length;i++ )
            {
                ShowType(Per[i]);
            }

            Console.ReadKey();

        }

        /// <summary>
        /// 人调用对应类的方法
        /// </summary>
        /// <param name="p"></param>
        public static void ShowType(Person p)
        {

            if (p is Teacher )
            {
                ((Teacher)p).SayTeacher();
            }
            else if(p is Student )
            {
                ((Student)p).SayStudent();
            }
            else if(p is ShuaiGuo )
            {
                ((ShuaiGuo)p).SayShuaiGuo();
            }
            else if (p is MeiNv )
            {
                ((MeiNv)p).SayMeiNv();
            }
            else if (p is YeShou )
            {
                ((YeShou)p).SayYeShou();
            }
            else
            {
            //把人这个基类放到最后是为了先判断一个人是不是子类中的老师啊,学生等,如果都不是那只能是人了。但如果放到前面,那么每个子类都可以转化成基类,都会执行person的方法,就不符合逻辑了
                ((Person)p).SayPerson();
            }
        }
    }

    public class Person
    {
        string _name;
        public string Name
        {
            get { return _name; }
        }
        int _age;
        public int Age
        {
            get { return _age; }
        }
        char _gender;
        public char Gender
        {
            get { return _gender; }
        }
        public void SayPerson()
        {
            Console.WriteLine("我是人");
        }
    }
    public class Teacher:Person 
    { 
        int _salary;
        public  int Salary
        {
            get { return _salary; }
        }
        public void SayTeacher()
        {
            Console.WriteLine("我是老师");
        }

    }
    public class Student:Person
    {
        string _id;
        public string Id
        {
            get { return _id; }
        }
        public void SayStudent()
        {
            Console.WriteLine("我是学生");
        }

    }
    public class ShuaiGuo:Person
    {
        public void SayShuaiGuo()
        {
            Console.WriteLine("我是帅锅 ");
        }
    }
    public class MeiNv : Person
    {
        public void SayMeiNv()
        {
            Console.WriteLine("我是美女");
        }
    }
    public class YeShou : Person
    {
        public void SayYeShou()
        {
            Console.WriteLine("我是野兽");
        }
    }

}


这样主函数入口就变的很有逻辑,很简单。只有三个功能:1.找10个人 2.给这些人分配角色 3.这10个人根据不同的角色干不同事情。而人,角色都已经生成为了类,一个人根据不同角色做不同的事也成为了方法。这样就像造汽车一样,主函数入口成了一个汽车加工组合的工厂,类和方法就像各个成形的,已经制造号的零件一样,只要拿过来,按照自己的目的组装就行了。

总结

类和继承是面向对象中很重要的一块。C#和我现实生活有很多相似的地方。比如我们现在生产的分工越来越细了,日本丰田的大多数零部件并非日本国产,而是来自20多个国家的160多家工厂,轮胎来自马来西亚,因为马来西亚盛产橡胶,马来的轮胎应该属于世界顶尖的。所以一个好的东西,不一定要自己亲力亲为,吃个饭还要自己种地,自己磨面,自己做。我们要做就是利用好各地的优势资源进行组装就OK了。

编程也是一样,把各个能独立的功能都分出去,分给各个工厂,像类,方法等,然后找最优质的零部件进行重组。这样做不但可以提高软件质量,还可以实现各式各样的功能,和高内聚低耦合的目标。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: