C#:里氏转换法的引用、通过子类 访问父类的元素、集合的使用
最为简单的理解就是子类对象可以赋值给父类,父类可以通过强制转换成为子类,通常使用的转换的关键词as、is。当使用is进行转换的时候,如果转换成功返回的是true,如果转化失败返回是flase,当使用is进行转换的时候如果转换成功返回的是转换后的对象,如果转换失败返回的是null。
实例代码;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 里氏转换法
{
class Program
{
static void Main(string[] args)
{
//将子类的对象赋值给父类的对象
//父类的对象虽然是使用子类的对象进行赋值,但是保持父类的属性,所以该对象只能调用父类的函数,元素等等
Person p = new Student("张三", 34, '男', 100);//这里从表面上看是不同类型数据之间的赋值,事实上不是,因为这里的student是继承了Person,所以student类具有Person的属性
p.CHLSS(); //这里是使用父类的对象访问父类的方法
//使用关键字is进行类的对象的转换,如果能转换,则结果是true,如果不能转换结果是false
//if (p is Student)
//{
// Student s = (Student)p; //将Person的对象转换成为student的对象
// s.CHLSS();
//}
Student s = p as Student; //使用关键字直接进行类的转换
s.CHLSS();//这里使用的是子类的对象访问子类的方法
Console.ReadKey();
}
}
public class Person
{
string _name;
int _age;
char _gender;
public Person(string _name, int _age, char _gender)
{
this._name = _name;
this._age = _age;
this._gender = _gender;
}
public void CHLSS()
{
Console.WriteLine("我是人类,我叫{0},今年{1}岁,性别{2}",this._name,this ._age,this ._gender);
}
}
public class Student : Person
{
int _score;
public Student(string _name, int _age, char _gender, int _score) : base(_name, _age, _gender)
{
this._score = _score;
}
public new void CHLSS()
{
Console.WriteLine("我的分数是{0}", this._score);
}}}
运行结果;
/*知识点:
* 1.子类的对象可以调用父类的函数以及元素,字段等等,父类的对象只能调用自己的函数以及字段
* 2.子类的对象可以赋值给父类的对象,但是此时表现的性能依旧是父类的对象的性能。
* 3.可以使用is关键字判断两个对象之间时候可以发生转换,如果可以返回的是true,如果不可以返回的是false
* 4.可以是as进行对象之间的转换,如果转换成功将返回转换后的对象,如果转换失败将会返回null
*/
子类访问父类中被保护的字段:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01protected访问修饰符
{
class Program
{
static void Main(string[] args)
{
Studnet s = new Studnet();
Person p = new Person();
s.SayHello();
Console.ReadKey();
}
public class Person
{
protected string _name;
public void SayHello() {
Console.WriteLine("你好我是父类");
}
}
public class Studnet: Person
{
public new void SayHello() {
_name = "张三"; //这里不需要进行字串的定义,因为子类继承父类,所以子类可以访问父类protect修饰符修饰的访问权限。
Console.WriteLine("姓名:{0}",this ._name);
}
}
}
}
运行结果:
/*知识点:
* 1.使用private关键字进行修饰的字段和函数,只能在该类的内部进行使用。
* 2.使用proteed关键字修饰的字段和函数,只能在该类的内部以及该类的子类的内部进行访问。
*/
集合的使用:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _02ArrayList集合的使用
{
class Program
{
static void Main(string[] args)
{
//数据中存放的数据是单一的,并且数组的长度是不可变的。
//集合中的数据是任意的,并且集合的大小是可变的
ArrayList list = new ArrayList(); //创建一个集合对象
//在集合里面添加单个的元素,使用的方法是Add();在集合中添加一个新的集合使用的是addrange()方法
list.Add(11);
list.Add("集合你好");
list.Add('否');
list.Add(5000m);
//向集合中添加数组,或者是集合的时候,不要使用ADD()方法,这样打印在控制台上的是改数组的命名空间
list.AddRange(new string[] { "你好", "Hello", "我喜欢写程序" }); //在集合中添加一个字符串数组
list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 });//在集合中添加一个集合,数组也相当于是一个集合
Person p = new Person();
list.Add(p);//在集合中放入一个类的对象
// list.Clear();//清空集合中的所有的内容
// list.Contains("你好"); // 判断集合中是否包含指定的内容
//list.Insert(1,"我爱中国"); //集合中指定的位置插入特定的内容
// list.Remove("集合你好");//移除集合中特定的内容
// list.RemoveAt(2);//移除集合中对应索引中的内容
// list.RemoveRange(1, 4); //移除集合中特定范围了的内容
// list.Reverse();//实现集合的反转
// list.Sort();//集合的升序,注意在进行集合的升序的时候,可能会出现错误,因为可能会出现集合中的数据类型不同无法进行比较
for (int i = 0; i < list.Count; i++)
{
if (list[i] is Person)
{
((Person)list[i]).SayHelllo(); //将对象进行转换
}
else
{
Console.WriteLine(list[i]);
}
}
Console.ReadKey();
}
}
public class Person
{
public string _name;
public void SayHelllo()
{
Console.WriteLine("你好,我是父类");
}
}
}
运行结果:
/*知识点:
* 1.集合中可以存放任意类型的变量,集合的大小是可变的
* 2.集合中添加内容的方法分别是Add(),AddRande()
*/
集合的长度:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _03集合的长度
{
class Program
{
static void Main(string[] args)
{
//ArrayList list = new ArrayList(); //创建一个集合
//list.Add(1);
//Console.WriteLine(list .Count);
//Console.WriteLine(list.Capacity);
//Console .ReadKey();
#region 在集合中放入一个数组,求出集合中的总数,以及平均值
//ArrayList list = new ArrayList();
//list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
//int sum = 0;
//int max = (int)list[0];
//for (int i = 0; i < list.Count; i++)
//{
// sum += (int)list[i]; //Int 类型是object类型的子类,上面在进行集合的赋值的时候装入的也是int类型的变量,所以可以进行强制转换
// if (max < (int)list[i])
// {
// max = (int)list[i];
// }
//}
//Console.WriteLine("最大值:{0} ,总数是:{1},平均值是{2}", max, sum, sum / list.Count);
//Console.ReadKey();
#endregion
#region 在集合中存入10个不同的随机数
ArrayList list = new ArrayList(); //创建一个集合
Random r = new Random();//创建一个随机数对象
for (int i = 0; i < 10; i++)
{
int rNumber = r.Next(0, 10); //注意这里的区间虽然是(0.10),但是实际能取到的内容是0-9;
if (!list.Contains(rNumber))
{
list.Add(rNumber);
}
else
{
i--;
}
}
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadKey();
#endregion
}
}
}
运行结果:
/*知识点:
* 1.集合实际的长度是储存的内容的长度
* 2.集合能够储存内容的长度通常是集合超过特定的范围的时候的二倍。
*/