C#自学笔记_010_Real

C#自学笔记_010_Real

一、继承

1、把几个类中重复的成员、方法丹迪按出来风险装成一个父类
Student,Teacher,Driver 子类 派生类
Person 父类 基类
子类继承了父类,那么子类从父类那里继承了成员和方法。但是不能继承父类的私有字段

子类并不能继承父类的构造函数,但是,子类默认会调用父类无参的构造函数来创建父类的对象,从而让子类对象可以调用父类的成员。
所以,如果在父类中重新创建一个有参数的构造函数之后,父类无参数的构造函数就会被销毁,子类就调用不到父类无参数构造函数,因此会报错。解决方法:
1)在父类中重新写一个无参数的构造函数。
2)在子类中显示调用父类的构造函数,使用关键字:base()

2、继承的性质:
(2)继承的单根型
一个子类只能由一个父类
(3)继承的传递性

3、查看类图
邮件资源管理器的继承,选择视图,点击查看类图,就可以查看类与类之间的继承关系

练习代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp010
{
    class Program
    {
        static void Main(string[] args)
        {
            Student s = new Student("张三", 23, '男', 123456);
            s.CHLSS();
            s.study();


            Console.ReadKey();
        }
    }

    public class Person
    {
        public Person(string name, int age, char gender)
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;
        }

        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        public void CHLSS()
        {
            Console.WriteLine("吃喝拉撒睡");
        }
    }

    public class Student : Person
    {
        public Student(string name, int age, char gender, int id)
            : base(name, age, gender)
        {
            this.Id = id;
        }

        private int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public void study()
        {
            Console.WriteLine("学生会学习。");
        }
    }

    public class Teacher : Person
    {
        public Teacher(string name, int age, char gender, int salary)
            : base(name, age, gender)
        {
            this.Salary = salary;
        }

        private int _salary;
        public int Salary
        {
            get { return _salary; }
            set { _salary = value; }
        }

        public void Teach()
        {
            Console.WriteLine("老师会教书。");
        }
    }

}

4、object是所有类的基类
5、new关键字
1)创建对象(分三个方面)
2)隐藏从父类继承过来的同名成员(后果:子类调用不到父类的成员)

6、里式转换

1)子类可以赋值给父类
2)如果父类中装的是子类对象,那么可以将这个父类强转为子类对象

7、is和as关键字
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能转换则返回一个对应的对象,否则返回一个null。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp010p
{
    class Program
    {
        static void Main(string[] args)
        {
            //1)子类可以赋值给父类
            //如果在程序中有一个地方需要父类作为参数,那么可以用一个子类代替。
            Student s = new Student();
            Person p = s;
            Person p = new Student();//以上两行代码的简写

            //2)如果父类中装的是子类对象,那么可以将这个父类强转为子类对象
            Person p = new Student();
            Student ss = (Student)p;
            ss.StudentSayHello();

			 //is关键字:
            if (p is Student)
            {
                Student tea = (Student)p;
                tea.StudentSayHello();
            }
            else
            {
                Console.WriteLine("转换失败");
            }

            //as关键字
            Teacher t = p as Teacher;

            Console.ReadKey();
        }
    }

    public class Person
    {
        public void PerSayHello()
        {
            Console.WriteLine("我是一个父类。");
        }
    }

    public class Student : Person
    {
        public void StudentSayHello()
        {
            Console.WriteLine("我是一个学生。");
        }
    }


    public class Teacher : Person
    {
        public void TeacherSayHello()
        {
            Console.WriteLine("我是一名老师。");
        }
    }

}

8、protected关键字
受保护的,可以在当前类的内以及该类的子类中访问。

9、小练习

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp010plus
{
    class Program
    {
        static void Main(string[] args)
        {
            Person[] pers = new Person[10];
            Random r = new Random();
            for (int i = 0; i < 10; i++)
            {
                int rNumber = r.Next(1,5);
                switch (rNumber)
                {
                    case 1:
                        pers[i] = new Student();
                        break;
                    case 2:
                        pers[i] = new Teacher();
                        break;
                    case 3:
                        pers[i] = new Driver();
                        break;
                    case 4:
                        pers[i] = new Police();
                        break;
                }
            }

            for (int i = 0; i < 10; i++)
            {
                if (pers[i] is Student)
                {
                    ((Student)pers[i]).StudentSayHello();
                }
                else if (pers[i] is Teacher)
                {
                    ((Teacher)pers[i]).TeacherSayHello();
                }
                else if (pers[i] is Driver)
                {
                    ((Driver)pers[i]).DriverSayHello();
                }
                else if (pers[i] is Police)
                {
                    ((Police)pers[i]).PoliceSayHello();
                }
                //else 
                //{
                //    pers[i].PersonSayHello();
                //}

            }


            Console.ReadKey();
        }

        public class Person
        {
            public void PersonSayHello()
            {
                Console.WriteLine("我是一个人");
            }
        }

        public class Student : Person
        {
            public void StudentSayHello()
            {
                Console.WriteLine("我是一名学生");
            }
        }

        public class Teacher : Person
        {
            public void TeacherSayHello()
            {
                Console.WriteLine("我是一名老师");
            }
        }

        public class Driver : Person
        {
            public void DriverSayHello()
            {
                Console.WriteLine("我是一名司机");
            }
        }

        public class Police : Person
        {
            public void PoliceSayHello()
            {
                Console.WriteLine("我是一名警察");
            }
        }
    }
}

二、集合

1、命名空间using System.Collection;

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace Csharp010Pro
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList List = new ArrayList();
            //List.Add(12);
            //List.Add(3.14);
            //List.Add('男');
            //List.Add("张三");
            //List.Add(true);
            //List.Add(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
            //Person p = new Person();
            //List.Add(p);
            //List.Add(List);
            //for (int i = 0; i < List.Count; i++)
            //{
            //    if (List[i] is Person)
            //    {
            //        ((Person)List[i]).SayHi();
            //    }
            //    else if (List[i] is int[])
            //    {
            //        for (int j = 0; j < ((int[])List[i]).Length; j++)
            //        {
            //            Console.Write(((int[])List[i])[j]);
            //        }
            //        Console.WriteLine();
            //    }
            //    else
            //    {
            //        Console.WriteLine(List[i]);
            //    }
            //}

            ArrayList List = new ArrayList();
            List.Add(10);
            List.Add(true);
            List.Add("张三");
            //添加集合使用AddRange函数
            List.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });

            //List.Clear(); //移除集合中的所有元素。
            //List.Remove(true); //删除单个被选中的元素
            //List.RemoveAt(0); //根据下标删除元素
            //List.RemoveRange(0,3); //根据下标移除一定范围的元素 Range(删除的起始点,要删除的元素个数)
            //List.Sort(); //升序排列(元素数据类型需保持一致)
            //List.Reverse(); //倒序排列
            //List.Insert(1, "插入的");
            //List.InsertRange(2, new string[] { "李四", "王五", "赵六" }); //在制定位置插入集合
            //bool b = List.Contains(10); //判断是否含有括号内的内容,返回bool类型

            for (int i = 0; i < List.Count; i++)
            {
                Console.WriteLine(List[i]);
            }


            Console.ReadKey();
        }

        public class Person
        {
            public void SayHi()
            {
                Console.WriteLine("Hello World!!");
            }
        }
    }
}

集合的长度问题

1、
count : 表示这个集合中实际包含的元素个数
capcity : 标示这个集合中可以包含的元素的个数

2、
每次集合中实际包含的元素个数(count)想超过了可以包含的元素个数(capcity)的时候
集合就会想内存中申请多开辟一倍的空间,来保证集合的长度一直够用

            //2、集合长度的问题
            ArrayList list = new ArrayList();
            //count : 表示这个集合中实际包含的元素个数
            //capcity : 标示这个集合中可以包含的元素的个数
            list.Add(1);
            list.Add(1);
            list.Add(1);
            list.Add(1);
            list.Add(1);
            list.Add(1);
            list.Add(1);
            list.Add(1);
            list.Add(1);

            //每次集合中实际包含的元素个数(count)想超过了可以包含的元素个数(capcity)的时候
            //集合就会想内存中申请多开辟一倍的空间,来保证集合的长度一直够用

            Console.WriteLine(list.Count);
            Console.WriteLine(list.Capacity);

3、练习:

 //练习1、创建一个集合,添加一些数字,求平均数和综合
            ArrayList list = new ArrayList();
            list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
            int sum = 0;
            for (int i = 0; i < list.Count; i++)
            {
                sum += (int)list[i];
            }
            Console.WriteLine("sum = {0}, Average = {1}", sum, (sum / list.Count));

//练习2:写一个长度为10的集合,往里面添加数值(0-9)
            //但是要求所有的数字都不重复
            ArrayList list = new ArrayList();
            Random r = new Random();
            for (int i = 0; i < 10; i++)
            {
                int rNumber = r.Next(0, 10);
                
                if (!list.Contains(rNumber))
                {
                    list.Add(rNumber);
                }
                else
                {
                    i--;
                }
            }
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }

HashTable (键值对集合) --字典

1、HashTable


            //HashTable(键值对集合)--字典
            //创建一个键值对集合对象
            Hashtable ht = new Hashtable();
            ht.Add(1, "张三");
            ht.Add(2, true);
            ht.Add(3, '男');
            ht.Add(false, "错误的");

            //在键值对集合中,是根据键去找值的
            Console.WriteLine(ht[1]);
            Console.WriteLine(ht[2]);
            Console.WriteLine(ht[3]);
            Console.WriteLine(ht[false]);

            Console.WriteLine("====================="); //分隔符
            for (int i = 0; i < ht.Count; i++)
            {
                Console.WriteLine(ht[i]);
            }

2、foreach循环
(1)var类型:
根据初值来判断变量类型,缺点是定义一个var变量时必须进行赋初值,否则系统报错。
(2)
键值对集合对象名.Keys——>对象的键
键值对集合对象名.Values——>对象的值
(3)键值对集合中,键必须是唯一的,而值是可以重复的。
(4)

ht[6] = "李四"; //这也是一种添加值的方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仲子_real

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值