C#知识点-08(继承,继承里的构造函数问题、里氏替换原则、ArrayList集合)

发布时间:2024年01月19日

继承

定义:把类中的一些共有的属性和方法,单独的封装到一个类中,这个类就是这些类的父类(基类),其他类称之为子类(派生类)
子类继承父类语法“子类名:父类名”
1、继承减少了大量的冗余代码;让类与类之间产生了练习,为多态打下了技术
2、子类只能继承父类非private的成员,不能继承私有字段
3、子类的成员名称如果和父类成员名称一样,那么子类就会隐藏掉父类的成员。结果就是,子类无法调用父类的重名成员,只能调用自己的成员。这个问题可以通过new关键字来解决
4、可以通过base关键字,显示地调用父类的成员
?

?
class Father
    {
        public void SayHello()
        {
            Console.WriteLine("父类说你好");
        }
    }
    class Son : Father
    {
        public new void SayHello()
        {
            Console.WriteLine("子类说你好");
        }
    }

?

5、单根性:一个子类只能有一个父类
6、传递性:父类可以传递给子类的子类

继承构造函数问题

1、子类没有继承父类的构造函数
2、子类虽然没有继承父类的构造函数,但是子类默认会调用父类无参数的构造函数。如果在父类中,有了新的有参数的构造函数,父类默认无参数的构造函数就消失了,子类就调不到了,然后子类就开始报错了。所以想要父类新建有参构造函数时,子类不报错,则需要在父类再写一个无参构造函数
3、为什么要调用父类的无参构造函数?
? ? ? ? 可以专门初始化子类共有并且属性值相同的属性。
?

internal class Program
    {
        static void Main(string[] args)
        {
            Man man = new Man();
            Console.WriteLine(man.Country);//输出为“中国”
            Woman woman = new Woman();
            Console.WriteLine(woman.Country);
            Console.ReadKey();//输出为“中国”
//因为在创建子类对象的时候,默认会调用父类无参的构造函数
        }
    }
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Country { get; set; }
        public Person(string name, int age, string country)
        {
            Name = name;
            Age = age;
            Country = country;
        }

        public Person()
        {
            this.Country = "中国";
        }
    }
    class Man : Person
    {
        public Man() { }
    }
    class Woman : Person
    {
        public Woman() { }
    }

4、子类如果要显示的调用父类的构造函数,使用base关键字
?

 static void Main(string[] args)
        {
            Man man = new Man("张三",20,175);
            Woman woman = new Woman("小红", 18, 165);
            Console.ReadKey();
            //这时候子类只会调用父类有参构造函数,不会调用父类无参构造函数了
        }
    }
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Person(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
    }
    class Man : Person
    {
        public int ManHeigh { get; set; }

        public Man(string name,int age,int manheight):base(name,age)
        {
            this.ManHeigh = manheight;
        }
    }
    class Woman : Person
    {
        public int WomanWeight { get; set; }
        public Woman(string name, int age, int womanweight) : base(name, age)
        {
            this.WomanWeight = womanweight;
        }
    }



C#有一个共同的父类,object。 如果一个类,没有显示的继承另一个类,那么这个类就继承了object 如果一个类,就算是显示的继承了另外一个类,这个类,同样也继承了object

里氏替换原则 - 七大设计原则之一

定义:子类可以赋值给父类。如果有个地方需要父类作为参数,我们可以传递一个子类对象

类型转换:
as关键字:1、如果能转换成功,则返回对应的对象。指向的一定是对应的子类对象才能转换成功? ? ? ? ? ? ? ? ? ? 2、如果转换失败,返回null
is关键字:通过is关键字,可以判断是否可以进行类型转换
?

internal class Program
    {
        static void Main(string[] args)
        {
            Person p = new Man();
            if (p != null)
            {
                Man m = p as Man;//as转换
            }
            if(p is Man)//is判断p能否转为Man子类对象
            {
                Man m = p as Man; 
            }
            if (p is Man)
            {
                Man man = (Man)p;//强制类型转换
            }
            
        }
    }
    class Person { }
    class Man : Person { }
    class Woman : Person { }

ArrayList

特点:存储的数据的类型和长度都不固定
1、添加单个元素用Add,添加集合用AddRange
2、为什么可以放任意类型的元素进去?因为子类可以赋值给父类(object)
??????为什么可以放任意长度的集合进去?因为ArryList会每次多开辟一些空间
3、list.Insert(1,"你好")//在索引为1后面的位置插入“你好”。Indert是在指定的位置插入一个元素
4、list.InsertRange(1,new int[]{1,2,3})//在索引为1的元素后面插入一个“1,2,3”集合.InsertRange是在指定的位置插入一个集合
5、list.Clear()//删除集合里的所有元素
6、list.Remove("张三")//把list集合里的值为张三的元素删除了。Remove可以根据值或索引删除元素
7、list.RemoveRange(0,2)//从0开始删除两个
8、list.Sort()//排序,只能是集合里的数据类型相同
9、list.Reverse()//集合里的元素反转

文章来源:https://blog.csdn.net/TY1806722496/article/details/135684284
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。