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

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.打人();

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值