当前位置: 代码迷 >> 综合 >> 【C#】面向对象(7)——类的继承和组合
  详细解决方案

【C#】面向对象(7)——类的继承和组合

热度:93   发布时间:2023-10-01 20:57:46.0

1、定义类的时候不指定父类,则父类是Object类。Object类是任何类的直接或者间接父类。所有类都是Object的子类

2、例1:

class  person
{public  string  name{get;set;}public  int  age{get;set;}
}
public class Chinese:Person
{public string HuKou{get;set;}public void KongFu(){....}
}
Chinese p1 = new Chinese();
p1.Name="李雷";
p1.HuKou="北京市朝阳区";
p1.SayHello();
p1.KongFu();
class  Chinese:person   //继承,:后为父类名
{string
}
class  Japanese:person
{
}

在别的类中调用:

Chinese  c=new  Chinese();  //拥有person类Chinese类中的所有public要素。Japanese  j=new  Japanese();  //拥有person类Japanese类中的所有public要素。

父类的变量可以指向子类的变量。如:

Person  p=c;  //c从变量看是一个Chinese,所以可以把一个person标签贴到c上。

子类的变量不能直接指向父类的变量,必须要进行显示转换。如:

Chinese  c2=p;  //错误。p从变量看是一个person,所以不可以把一个Chinese标签直接贴到c上。
Chinese  c2=(chinese)p;  //正确。如果转换失败,则抛出异常。
Chinese  c3=p  as  chinese;  //跟上一行的效果相同,也是显式转换。如果失败,结果是null,不报错。
if(p1  is  japanese)  //is是运算结果为bool的运算符,表示p1指向的对象是否是指定的类型。
{Console.writeLine(“日本人”);
}
else  if(p1  is  chinese)
{Console.writeLine(“中国人”);
}

3、有new的地方就有对象。方法名可以是中文。类与类之间主要有两种关系:继承、组合。一个类对象可以作为另一个类的成员。类的属性、字段可以是另外一个对象。一个类调用另外一个类实现的动作就叫组合

 

4、当new一个子类时,先执行父类,再执行子类。如下面的例子,当B  b=new  B;时,先执行①,再执行②,即输出:

构造A

构造B

如果A还有父类,则先执行A的父类,再执行A,再执行B,以此类推。

先调用父类的构造函数。

子类可以调用父类中的public成员,但不能调用private成员。如下面的例子中,③不可以调用,④可以。

Protected  保护类,类似于遗产保护类。自己可以调用。子类也可以调用,子类的子类等间接子类也可以调用。其他类不能调用

class  A
{public  A(int  i){}public  A(){Console.writeLine(“构造A”);  //①}private  void  m1(){}publice  void  m2(){}protected  void  m3(){}
}
class  B:A
{public  B()  //默认已经有“:base”,调用父类中的无参构造函数,也可以写成public  B():base。只是“:base”可忽略不写而已。{Console.writeLine(“构造B”);  //②this.m1();  //③,错误,不可调用。Private成员只有自己能调用,儿子也不能调。this.m2();  //④,正确,可调用base.m3();  //调用父类的m3。跟“this.m3();”是一样的。C#中Base就是父类、基类的意思,在别的语言中叫super,即超类。}
}
class  program()
{static  void  Main(string[]  args){B  b=new  B();A  a=new  A();}
}

5、类的继承与组合:

class  LiGang
{public  打人(){Console.WriteLine(“拳打脚踢”);Console.WriteLine(“飞毛腿”);Console.WriteLine(“十八掌”);}Public  掀摊子(){}
}

继承方式实现复用。只有父类的大部分行为、状态都需要的时候才继承。

class  LRJ:LiGang
{
}

组合方式实现复用。组合方式没有继承的包袱,用的更多。

class  TuFei
{public  LiGang  LG{get;  set;}public  void 打人(){LG.打人();}
}

调用部分的代码:

TuFei  t=new  TuFei();
t.LG=new  LiGang();
t.打人();