面向对象的三大特征

一、封装

1.封装是什么?

封装就是:每个对象都包含它能进行操作所需要的所有信息。比如Cat 类,里面包含着它的方法和属性,客户端通过实例来实现。

2.为什么要有封装?(优点)

(1)良好的封装可以减少耦合。比如我们创建的Cat类和客户端类分离了,这样减少了他们之间的耦合,其中一个类做修改,不影响其他类。

(2)类内部的实现可以自由的修改。比如,我们在Cat类中可以做很大的修改。

(3)类具有清晰的对外接口。比如我们在Cat类中创建的Shout方法,在客户端我们可以直接实现这个功能

3.封装的优缺点:

优点在第二条已经说了,它有三个优点。

那他有没有缺点呢?当然有。

我们已经写了一个猫类,如果现在让你写个狗类,你只需要把猫类的东西复制过来,然后把名字改了即可,可见他们之间的代码有90%都是一样的,显然这样是不行的。那现在我们就要用到面向对象的第二大特性了“继承”。

二、继承

1.继承是什么?

继承是类与类的一种关系,是一种“is-a”的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。

注意:在C#中,子类从他的父类中继承的成员有方法、域、属性、事件、索引指示器,但对于构造方法,有一些特殊,他不能被继承,只能被调用。

2.继承的优点?

(1)子类拥有父类非Private的属性和功能

什么叫非private,除了private 还有两个比较常用的修饰符,public 公有的,在本类或者其他类都可以调用,是公开的。另一个是:protected。protected表示继承时子类可以对父类有完全的访问权,也就是说,用protected修饰的类成员,对于子类是公开的,但对于其他类不公开。所以子类继承于父类,则子类就拥有了父类的除private外的属性和功能。

(2)子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能。

比如猫类可以有上树的功能。狗类有追兔子的功能。

(3)子类还可以以自己的方式实现父类的功能(方法重写)

子类如果对继承的父类的方法不满意(不适合),可以自己编写继承的方法,这种方式就称为方法重写

当调用方法时会优先调用子类的方法。

重写要注意:

     a、返回值类型

  b、方法名

  c、参数类型及个数

都要与父类继承的方法相同,才叫方法的重写。

重载和重写的区别:

     方法重载:在同一个类中处理不同数据的多个相同方法名的多态手段。

  方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。

3.继承的优缺点

优点在第二条已经体现出来了,那么继承有没有缺点呢,当然有啦,

继承的缺点就是:父类变,子类不得不变。继承会破坏包装,父类实现细节暴露给子类,两个类之间存在着耦合性。

继承有缺点,我们到底该不该用呢?

当两个类之间具备is-a的关系时,我们就可以考虑用继承了

三、多态

1.多态是什么?

按字面意思来看,多态就是对象的多种形态。多态表示不同的对象可以执行相同的操作,但要通过他们自己的实现代码来执行。

比如:我们的国粹“京剧”以前都是子承父业,代代相传的艺术。假设现在有这样一对父子,父亲是非常有名的京剧艺术家,儿子长大成人,模仿父亲的戏也是惟妙惟肖。有一天父亲突然得病了,不能上台表演了,而票已经卖出,退票显然会大大影响声誉。怎么办呢?由于京戏都是需要化妆才可以上台的,于是就决定儿子代表父亲上台表演。儿子在表演的时候,是以父亲的身份出现的,所以儿子自己的绝活是不能表现出来的。儿子模仿的再好,那也是模仿,儿子只能用自己理解的表现方式去模仿父亲的作品。儿子可以代表父亲上台表演,但是儿子要通过自己的方式去模仿父亲的操作。这就是多态。
 

那么儿子怎么用自己的方式去模仿父亲的操作呢?这就用到了虚方法和重写。为了让儿子能顺利的代表父亲去表演,父亲中的方法必须是虚拟的,这样才能让儿子去重写父亲的方法。例子如下:

 class Animal
    {
        protected string name;
        public Animal(string name)
        {
            this.name = name;
        }
        public Animal()
        {
            this.name = "无名";
        }
        public virtual string Shout()
        {
            return "";
        }
    }
    class Cat :Animal
    {
        public Cat ():base()
        {

        }
        public Cat (string name):base( name)
        {

        }
        public override string Shout()
        {
            return "喵";
           
        }
    }

在父类中把Shout()虚化,然后在子类中重写该方法。当猫(子类)代表动物(父类)表演Shout(),但Cat叫出来的是“喵”。如果在有一个Dog类,那么Dog叫出的是“汪”。这就是不同的对象可以执行相同的操作,但是要通过自己来实现。

 

看了这些例子,面向对象的三大特种就容易懂了吧。如文中有不足之处,还望大神们多多指教。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张铎(信念)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值