‫在上一个视频中, 您学习了继承和继承的基础知识｡
‫但是, 现在让我们更深入一点, 看看几个关键词, 这将是相关的, 当谈到继承｡
‫我们要看的是virtual和override关键字｡
‫现在, 你可能想知道, 为什么我们在屏幕上有动物？
‫为什么丹尼斯要展示一堆动物的图片？
‫问题是, 我们要实现一个animal类, 它允许我们继承,
‫animal是父类, 它有一些技能, 比如, 动物能做什么？
‫它能发出声音, 它能吃, 它能玩｡
‫这至少是我们要允许动物类做的｡
‫当然, 动物可以做更多的事情｡
‫我们给予它一些属性, 比如名字, 年龄属性, 如果它饿了, 那么只有饿了,
‫它才会吃东西, 否则它不会吃东西.
‫所以这就是创建动物类的想法｡
‫当然, 现在你可以自己实现这个类了｡
‫然后我们要使用继承, 不仅要使用相同的方法和属性, 还要重写它们,
‫基本上就是说, 狗发出的声音和猿, 猴子,
‫长颈鹿发出的声音是不同的｡
‫这基本上就是我们要实现的｡
‫通过这样做, 我们将学习不同的关键字, 如虚拟和覆盖关键字｡
‫因此, 让我们继续并为此创建一个新项目｡
‫我将使用一个控制台应用程序｡
‫我将称之为虚拟覆盖演示｡
‫好吧, 我会的
‫作为一个小挑战, 如果你想自己尝试一下, 请写一个名为animal的小类,
‫它将具有以下属性｡
‫名字叫陈老饿｡
‫当然还有一个构造函数, 还有一个叫做make sounds, eat, 以及play的方法, 如果你想的话,
‫可以实现所有这些方法, 因为这只是给予你一点练习,
‫来创建所有这些不同的方法｡
‫然后我们会看到如何把它们稍微修改一下这样我们就可以在继承中正确地使用它们了｡
‫好吧, 我希望你试过了｡
‫因此, 我们当然可以用control, k, c, 来创建一个新的类, 我把这个类命名为animal｡
‫正如我所说的, 这个动物类有几个特性.
‫所以name属性, H属性, 还有is hungry属性, 然后是一个简单的构造函数,
‫它使用了所有这些属性.
‫您可以看到我们只是使用了get set｡
‫顺便说一句, 如果你想真实的创建一个属性, 只需双击属性, 然后输入类型, 例如, 字符串,
‫然后在这里, 例如, 名称｡
‫所以这就是你如何快速地完成它, 而不必输入多余的内容｡
‫好吧, 我会的
‫这是我们的构造函数, 名字是H, 它是饥饿的.
‫你可以看到, 饥饿并不是我们在创建动物时就给它设置的,
‫但我们在一开始就默认设置为真｡
‫所以我把它设置成饥饿默认值｡
‫好吧, 我会的
‫所以现在我说我想有一个方法, 叫做发出声音｡
‫让我们来看看这个方法｡
‫所以我用了一个空的虚方法, 使声音为其他类所重写｡
‫我把这个方法设为虚拟的, 这样它就可以被继承自animal的类所覆盖｡
‫我们稍后会看到如何做到这一点因为动物发出的声音在很大程度上取决于动物本身.
‫所以饥饿是每个动物都要分享的东西, 因为, 嗯, 这就是我们的运作方式｡
‫我们需要能量, 我们通过食物获得能量｡
‫而为了激励自己去获取食物或去吃食物, 我们就有了饥饿感｡
‫但是我们这里的这个虚拟的方法, 这个发声的方法, 并不一定是空的｡
‫让我们来看看这个吃法｡
‫而且这种吃法也将是一种虚法｡
‫这允许我们的子类重写此方法｡
‫所以如果我们想重写eat方法, 我们可以这样做, 但我们不必这样做｡
‫您可以在此处看到常规功能｡
‫所以它会检查动物是否饿了｡
‫如果是的话, 那么它只会打印出名字, 并说它正在吃东西｡
‫然后如果它不饿, 它会说名字叫不饿｡
‫顺便说一句, 这个名字是我们动物的财产｡
‫所以这个名字, 是动物的属性｡
‫好的, 这就是我们的方法, 我们也要把它变成虚拟的｡
‫然后另一种虚拟方法将其发挥出来｡
‫所以这个虚拟法打基本上就是说名字是打在哪个控制台上｡
‫现在我们使用一些非常简单的红线语句｡
‫当然, 这可能是更复杂的代码｡
‫所以这只是为了简化整个事情, 让它更容易被人理解, 可以这么说,
‫因为玩和吃什么的,
‫这是我们可以直接理解的事情, 因为我们在生活中看到过, 我们自己也做过, 同时从数据库或类似的东西中阅读数据｡
‫这不是我们在真实的生活中经常看到的｡
‫好吧, 我会的
‫现在让我们定义从animal派生的类｡
‫这样就继承了动物类｡
‫让我们继续使用控制键K和C或者命令键K来看看｡
‫这将打开一个屏幕, 我们可以在其中创建一个类, 或者只创建一个类｡
‫否则, 我将创建一个dog类, 这个类将继承animal类, 就像这样｡
‫现在您已经可以看到, 没有给定的参数对应于动物名称字符串int所需的形参名称｡
‫所以我们需要在这里创建一个构造函数｡
‫因此, 让我们继续创建一个简单的构造函数, 它将遵循相同的结构｡
‫它会有名字和年龄, 它会使用基本名字H, 这样我们就可以使用定义那个动物的构造函数｡
‫现在我要用一个新的属性叫做Happy或者is Happy这是一个布尔值.
‫这将基本上只是存储, 如果动物在这种情况下, 狗是快乐的｡
‫所以如果狗是快乐的, 狗是快乐的动物, 它就会说真｡
‫所以默认情况下, 狗会很高兴｡
‫好了, 现在让我们重写这个方法｡
‫因此, 让我们简单地重写虚方法eat｡
‫因此我们使用了override关键字｡
‫所以像普通方法一样是public的, 但我们要添加这个override关键字.
‫所以撤销, 作废它｡
‫你也一样
‫或者类似于我们这里的方法, 但这里我们使用了一个虚拟关键字｡
‫这个virtual关键字允许我们的子类, 我们的继承类, 所以子类使用override关键字来基本上覆盖它的功能.
‫如果你还想调用animal类的父类的base函数, 在这个例子中我们需要用base,
‫它会说, 好吧, 调用base的方法, 这个base就会很好的你在这里看到animal.
‫所以当你双击base并高亮显示它的时候, 你可以看到animal也被高亮显示了, 因为animal是你的基类｡
‫如果你按住Ctrl键, 然后点击base, 它会跳到animal类, 因为那是基类.
‫你可以看到我们的基类有三个引用, 这里是这个基类, 这个基类,
‫还有顶部的这个动物.
‫好吧, 我会的
‫因此, 在这一点上, 我们基本上是在这里使用我们的基类, 基类功能, 我们没有重写任何东西｡
‫所以基本上我们是说狗和其他动物是一样的｡
‫所以这里没什么特别的｡
‫现在, 让我们来看看发声的方法, 因为这一种方法会有很大的不同,
‫因为狗必须发出正确的声音.
‫这种发声的方式就是汪｡
‫它也可以是汪或汪或任何东西｡
‫然而, 你的狗喜欢发出声音, 这就是在我的情况下狗会发出声音的方式｡
‫所以这对每种动物来说都是不同的｡
‫所以每种动物都会发出不同的声音｡
‫这就是为什么我们要覆盖make sound｡
‫嗯, 嗯, 这使得声音, 我们在这里｡
‫我们用我们的狗的单独实现来覆盖它｡
‫现在让我们用同样的方法来处理玩耍, 因为狗只有在开心的时候才想玩耍｡
‫所以让我们假设情况就是这样｡
‫这里, 如果我们看玩耍, 它说狗在玩耍, 但我对这个结果不满意｡
‫让我们说一只狗只会玩, 如果它是一个快乐的狗｡
‫所以我们能做的就是覆盖, 作废, 播放, 检查狗是否开心, 然后才播放.
‫所以我们已经用我们自己的狗的功能或者我们为狗添加条件的独特功能覆盖了基础动物的功能｡
‫但这可能是任何事｡
‫你并不局限于你的条件｡
‫这可能是一种完全不同的实现方式｡
‫你甚至不需要使用垒打, 所以你完全可以自由地使用任何你想要的｡
‫例如, 在make sound方法中, 你可以看到我们没有使用base, 因为在make
‫sound方法中, 没有什么可以调用的, 所以这里没有什么有趣的东西.
‫但即使有, 我们也不必呼叫基地, 制造声音或基地, 制造地方播放｡
‫如果我们愿意, 我们可以在这里实现完全不同的东西｡
‫那就是我们的狗｡
‫现在, 让我们继续保存这两个类, 并在我们的程序CSS文件中使用它们｡
‫好吧, 我会的
‫这里, 我们首先创建一个这样的狗, 我将调用这个狗, 这将是一个新的狗｡
‫这将有CIF的名字和狗将是15岁｡
‫这么漂亮的老狗｡
‫而现在｡
‫我们可以写这样的东西, 这样我们就可以访问狗的属性了｡
‫所以红线狗的名字｡
‫所以我们可以用狗的名字和年龄来得到狗的名字和年龄｡
‫然后我们就可以, 比如说, 玩耍和吃饭｡
‫好吧, 让我们做真实的快速｡
‫别玩狗吃屎了｡
‫那我们开始吧｡
‫我们可以看到Sive已经15岁了｡
‫最安全的游戏, 表面吃｡
‫好吧, 我会的
‫于是又是玩又是吃的工作｡
‫完全没问题｡
‫当然, 我们也可以使用Dog Dot｡
‫并在这里发出声音｡
‫这样狗就会发出声音｡
‫让我们运行这个｡
‫而你看到的股票, 说, 狼｡
‫好吧, 我会的
‫让我们快速回顾一下, 看看它与上一个视频中的示例有何不同｡
‫所以我们有了基类, 这个基类有一些属性, 也有一些方法, 函数,
‫可以这么说.
‫那么这里以发出声音为例, E法等等｡
‫我们通过添加virtual关键字使它们成为虚拟的, 以便使它们在继承类中是可更改或可重写的｡
‫所以dogs是继承类或子类｡
‫这个子类允许我们使用override关键字覆盖基类中的一个特定方法｡
‫现在就这样｡
‫覆写功能｡
‫因此它将替换当前方法的功能或代码｡
‫当然, 你是根据它来使用这个的｡
‫它所要做的就是调用基类的方法, 也就是父类的方法,
‫但是你可以在这里实现你自己的代码.
‫您不必呼叫基底类别｡
‫当然, 您可以添加条件, 以便在特定条件下调用基类功能｡
‫或者你可以在你的重写方法中编写你想要的任何代码, 然后其他的东西就不同了｡
‫也就是说, 我们在这里将程式码加入至我们的建构函式, 以进行｡
‫子类别｡
‫所以这个继承类dog一方面使用了我们基类使用的相同属性, 但同时它有自己的实现｡
‫一旦狗被创造出来, 会发生什么？
‫那么一旦一个狗对象被创建了呢？
‫在我们的例子中, 它只是说狗会很高兴｡
‫好吧, 我会的
‫这段视频到此为止｡
‫当然, 我们会更多地研究继承, 因为还有很多东西要学｡
‫下一段视频再见｡