首页 > 代码库 > 15-01-12 C# 面向对象 11

15-01-12 C# 面向对象 11

继承,解决类中的代码冗余;

我们写的类直接或者间接继承于Object类;

里氏转换两条 1.子类可以赋值给父类,//如果有一个地方需要父类作为参数,我们可以给一个子类代替;

Student s = new Student();

Person p = s;

Person p1 = new Student();

2.如果父类装的是子类对象,那么可以将这个父类强转为子类对象;

Student ss = (Student)p;

子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员;

is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false;

as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null;

if(p is Student)

{   

   Student ss = (Student)p;

}

else

{  

Console.WriteLine("转换失败");

}

 

 

Student ss = p as Student;

Student Teacher MeiLv ShuaiGuo YeShou 5个类都继承于Person类

Person[] pers = new Person[10]; //上面5个类的对象都可以放到这个数组里面,里氏转换第一条;

Random r = new Randon();

for(int i = 0; i<pers.Length;i++)

{  

int rNumber = r.Next(1,7);  

switch (rNumbr)

 {    

  case 1: pers[i] = new Student();     break;    

  case 2: pers[i] = new Teacher();     break;    

  case 3: pers[i] = new ShuaiGuo();   break;    

  case 4: pers[i] = new MeiLv();     break;    

  case 5: pers[i] = new YeShou();     break;    

  case 6: pers[i] = new Person();     break;      

}

}

 //Person[]类型的数组,无论你里面装的是什么类型的对象,表现出来的都是Person类型;

   for(int i = 0; i<pers.Length;i++)

{  

  //pers[i].PersonSayHi();    

  if(pers[i] is Student)    

   {       

    ((Student)pers[i]).StudentSayHi();   //里氏转换第二条;

     }   

  else if(pers[i] is Teacher)   

  {       

    ((Teacher)pers[i]).TeacherSayHi();

   }    

   else if(pers[i] is ShuaiGuo)   

   {       

    ((ShuaiGuo)pers[i]).ShuaiGuoSayHi();  

    }     

   else if(pers[i] is MeiLv)   

   {       

    ((MeiLv)pers[i]).MeiLvSayHi();

    }   

    else if(pers[i] is YeShou)   

   {      

    ((YeShou)pers[i]).YeShouSayHi();   

   }   

   else   

    {       

    pers[i].PersonSayHi();

     }

}

public:  公开的,公共的,在哪都可以访问;

private: 私有的,只能在当前类的内部访问;

protect: 权限要比private高,其他平级无关的类访问不到,但是它的子类可以访问protect的成员;  受保护的,可以在当前类的内部以及该类的子类中访问;

集合对于编程来说是非常重要的一个东西;

从面相对象开始,我们每天在写的代码;都是在实际项目中,开发中所要用到的内容;

ArrayList不是一个静态类;

ArrayList al = new ArrayList();

集合:很多数据的一个集合; 数组:长度不可变,类型单一(除了里氏转换的数组);       //长度可以任意改变,类型随便;

list.Add();  往集合中加单个元素;

list.count 集合的长度;

集合跟数组一样,通过下标访问元素;

我们将一个对象输出到控制台,默认情况下,打印的就是这个对象所在的类的命名空间;

在List[]里面无论你加什么内容,它都是object类型;

for(int i = 0;i<list.Count;i++)

{  

  if(List[i] is Person)             //有继承关系的时候才能转;   

{      

    ((Person)List[i]).SayHello();  

  }   

else if(List[i] is int[])   

{      

  for(int j = 0; j<((int[])List[i]).Length ; j++)    

   {          

Console.WriteLine(((int[])List[i])[j]);                

   }

  }    

else   

  {     

  Console.WriteLine(List[i]);   

   }

}

往ArrayList里面放数据很好,不用考虑类型,不用考虑长度,但是往外拿数据的时候很麻烦,如上面的那个对象和数组,因为放进去后它的类型是object,要正常使用必须进行类型转换;因此这个集合不好用

可以用list.AddRange(new int[]{1,2,3,4,5,6,7})方法来添加集合;

如果用add的方法添加数组或者对象或者集合,那么在取出来的时候会使用到上面那一坨类型转换的值 但是如果用addRange来添加的话,输出集合的时候就不需要类型转换了,而是直接将集合内的元素输出;

list.AddRange(list);

list.clear()将集合内的元素删完

list.Remove(true) //删除集合内的单个元素;

list.RemoveAt(0) //根据索引去删元素;

list.RemoveRange(0,3); //删集合中的第0个索引开始的元素,往后删3个;

list.Reverse();反转数组;

list.Sort();将集合升序排列;只限里面要数字吧;

list.Insert(1,"你好"); 在指定的索引处插入要插入的内容;插入的没有类型要求;

list.InsertRange(0,new String[]{"张三","李四"}); 在指定的索引处插入一个集合;

list.Contains(1);判断在list集合中是否包含1这个元素;

ArrayList之所以能添加任意元素进去,因为它所需的元素类型是object类型;

ArrayList之所以能够长度不限,跟它的两个count和capcity两个元素有关; //count表示在这个集合中实际所包含元素的个数; //capcity表示这个集合中可以包含的元素的个数;

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

ArrayList集合现在不太用了,学习这个集合是为了后面学习泛型集合做铺垫;

泛型集合跟他的区别就是泛型集合只能添加固定类型的元素,这点根数组一样,但是泛型集合长度不固定,这点数组做不到

ArrayList和HashTable两种集合存储的数据类型都是object,就是说任意类型的数据都可以存储到ArrayList和HashTable里面;

HashTable我们称之为键值对集合; 在键值对集合中,是很据键去找值的;

Hashtable ht = new Hashtable();

ht.Add(键,值);

键和值都是object类型;

一般要看数组或者ArrayList集合中的元素我们都要通过for循环来看,

ht[key] = value; 用for循环来遍历hashtable是不行的,因为键不一定是数字;要遍历键值对集合用foreach

foreach打出来按两下tab键就能出来foreach框架;

foreach(var item in collection)

{  

var:推断集合中项的类型  

item:循环的集合的每一项  

in 表示在什么什么里面

collection表示要循环的集合;

}

C#是一门强类型语言,Js是一门弱类型语言,

强类型:在代码当中,必须对每一个变量的类型有一个明确的定义,

int n = 15; n.GetType(); 获得类型;

弱类型:不需要对变量的类型有明确的定义,它能够根据变量的值来推断出变量的类型;

var n = 15; n.GetType(); 获得类型;类型也拿到了; var根据值能够推断出类型;

string input = Console.ReadLine(); //没错

var input = Console.ReadLine(); //报错;错误原因,声明var变量的时候必须给它赋初值;因此我们不常用;

foreach(var item in ht.Keys) //遍历集合中的键,此时item表示集合中的键,也可以遍历值ht.Values,此时item表示集合中的值

{

 Console.WriteLine(item,ht[item]);

}

int[] nums = {1,2,3,4,5,6,7};

foreach(var item in nums)

{

 Console.WriteLine(item);

}

for(int i = 0,i < nums.length; i++)

{  

Console.WriteLine(nums[i]);

}

当循环次数非常大的时候,foreach的循环效率要大大大于for循环; 在运行次数不大的情况下,他俩的效率是一样的;

键值对集合当中,键必须是唯一的,值是可以重复的,

ht.Add(1,"张三");

ht.Add(2,"李四");

ht.Add(1,"王五"); //出错了,因为前面已经有键为1的元素了,

ht[6] = "张三";

ht[1] = "赵六";//不会出错,而是把原来键是1的元素覆盖掉

在添加键值对集合元素的时候,先要判断一下是不是有了这个键,如果有的话就不添加,如果没有就添加,

if(!ht.ContainsKey("abc"))

{  

ht.Add("abc","cba");

}

ht.clear();

ht.Remove(key);

Path类是静态类;

string str = @"C:\Users\hhs\Desktop\BLOG\1.txt";

取出文件名; 按照字符串的方法根据LastIndexOf得到最后的\的索引,然后根据Substring截取字符串的方法得到文件名;

//Path类更简单;

Path.GetFileName(str);//快速获得路径下文件的名字;

Path.GetFileNameWithoutExtension(str);//快速获得路径下文件的名字,不包含扩展名;

Path.GetExtension(str);//直接得到文件的扩展名;

Path.GetDirectoryName(str);//获得文件所在的文件夹的名字;

Path.GetFullPath(str);获得文件所在的全路径;

Path.Combine(@"c:\a\","b.txt");将两个路径组合成一个路径;

Path这个类是专门用来操作路径的;

File这个类肯定是用来创建文件的,File也是一个静态类,

File.Create(@"c:\User\a.txt");//在指定路径新建文件,File这个类可以真真正正操作文件,还能创建.jpg .wav等文件;

File.Delete(@"c:\User\a.txt");//根据指定路径删除文件;

File.Copy(@"c:\User\a.txt",@"c:\User\b.txt"); //b.txt是复制后生成的,

File.Move();

ReadAllBytes();

WriteAllBytes();

字节数组转化为字符串; Encoding.Default.GetString(字节数组);

字符串转化为字节数组; Encoding.Default.GetBytes(字符串);

将字符串以什么样的形式保存为二进制,这个就是编码;

产生乱码的原因:就是你保存这个文件所采用的编码跟你打开这个文件所采用的编码格式不一致;

ASC ASCII GB2312 Big5 unicode UTF-8

多态是面向对象最集中的一块。

 

15-01-12 C# 面向对象 11