C# 之 继承
继承
继承是OOP最重要的特性之中的一个。不论什么类都能够从还有一个类中继承,这就是说,这个类拥有它继承的类的全部成员。
在OOP中,被继承的类称为父类。
在C#中的对象仅能直接派生于一个基类。
对象的继承代表了一种“is-a”的关系。假设两个对象A和B。能够描写叙述为“B是A”,则表明B能够继承A。
“猫是哺乳动物”。就说明了猫与哺乳动物之间继承与被继承的关系。实际上,继承者还能够理解为是被继承者的特殊化,由于它除了具备被继承者的特殊性外,还具备自己独有的个性。比如,猫就可能拥有抓老鼠、爬树等“哺乳动物”对象所不具备的属性。
假设子类继承与父类,第一、子类拥有父类非private的属性和功能;第二、子类具有自己的属性和功能,即子类能够扩展父类没有的属性和功能;第三、子类还能够以自己的方式实现父类的功能(方法重写)。
比如:考虑一个农场家禽家畜的类。这个类叫做Animal,拥有EatFood()和Breed()方法,我们能够创建一个子类Cow。支持全部这些方法。它也有自己的方法。如Moo()和SupplyMilk()。还能够创建还有一个子类Chicken,该类有Cluck()和LayEgg()
class Program
{
static void Main(string[] args)
{
Cow cow = new Cow("牛牛");
cow.EatFood();
cow.Breed();
cow.Moo();
cow.SupplyMilk(); Console.WriteLine(); Chicken chicken = new Chicken("咕咕");
chicken.EatFood();
chicken.Breed();
chicken.Cluck();
chicken.LayEgg();
}
}
//动物类
class Animal
{
protected string name = "";
public Animal(string name)
{
this.name = name;
}
public void EatFood() //吃东西
{
Console.WriteLine(this.name + "会吃东西");
}
public void Breed() //生殖后代
{
Console.WriteLine( this.name + "能生殖后代");
}
}
class Cow:Animal
{
public Cow(string name): base(name)
{ }
public void Moo() //牛叫
{
Console.WriteLine( "我的名字叫" + name + " 哞");
}
public void SupplyMilk() //提供牛奶
{
Console.WriteLine( "我的名字叫" + name + " 我能提供牛奶");
}
}
class Chicken : Animal
{
public Chicken(string name):base(name)
{ }
public void Cluck() //鸡叫
{
Console.WriteLine("我的名字叫" + name + " 咯咯咯");
}
public void LayEgg() //下蛋
{
Console.WriteLine("我的名字叫" + name + " 我能下蛋");
}
}
继承的长处:继承使得全部子类公共的部分都放在了父类,使得代码得到了共享。这就避免了反复,另外,继承可使得改动或扩展继承而来的实现都较为easy。
继承的缺点:假设父类改变,那么子类就不得不变。
继承会破坏包装,父类实现细节暴露给子类。增大了两个类之间的耦合性。
C# 之 继承的更多相关文章
- javaScript的原型继承与多态性
1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...
- JavaScript的继承实现方式
1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...
- javascript中的继承与深度拷贝
前言 本篇适合前端新人,下面开始...... 对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就 ...
- 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- JS继承类相关试题
题目一: //有关于原型继承的代码如下:function Person(name) { this.name = name;}Person.prototype = { getName : f ...
- JS继承之寄生类继承
原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...
- JS继承之借用构造函数继承和组合继承
根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...
- JS继承之原型继承
许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...
- 深入浅出JavaScript之原型链&继承
Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...
- 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型
前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.
随机推荐
- mfc 链接 access 2007 数据库
神马也不说了,直接给出源代码和project 原理这个东西 Google 下.都出来了.自己就说下作为新手 , 1 应该打印出,链接错误原因 2 应该将数据库放到project以下,特别注意这点 给 ...
- 走进windows编程的世界-----消息处理函数(2)
一 WM_PAINT消息 1 WM_PAINT的产生 因为窗体的互相覆盖等,产生须要绘制的区域,那么会产生WM_PAINT消息. 普通情况下,不直接发送WM_PAINT消息,通过API声明须要 ...
- hpuoj--校赛--送给新生的礼物(水题)
问题 A: 感恩节KK专场--送给新生的礼物 时间限制: 1 Sec 内存限制: 128 MB 提交: 631 解决: 187 [提交][状态][讨论版] 题目描述 学长KK要送给学弟学妹们礼物, ...
- ARM嵌入式复习
第一章 1.嵌入式系统 “以应用为中心,以计算机技术为基础,软硬件可裁剪,适用于应用系统对功能,可靠性,成本,体积,功耗要求严格的专用计算机系统” 根据应用的要求,沿着“体积小,低功耗,高可靠”方向发 ...
- JMeter使用碰到的问题
1.创建http请求 使用threadGroup-->add-->sampler--http request 2.使用计数器 使用threadGroup-->add-->con ...
- 线程1—Thread
随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread类实 ...
- GPU学习笔记(二)
找到了一个还不错的教程http://blog.csdn.net/augusdi/article/details/12527497 今天课比较多,但是有了这个教程解决了昨天不能运行的问题.
- Ubuntu 18.04图形化软件包管理器
1.ubuntu软件这个管理工具提供了一种管理您系统中软件的好方法,通过他可以很直观的查找软件安装很简单,打开终端,输入以下命令:----------------------------------- ...
- 一次Linux LVM VG丢失完整找回过程记录
某客户的一台PC服务器连接了一台HP EVA 的FC SAN存储,划了一个6T的LUN分作一个单独的VG使用,在某一次异常掉电之后,发现该VG完全丢失,使用vgs/pvs/lvs命令均无法找到此VG及 ...
- Linux-批量添加用户stu01..stu03,并设置固定的密码123456 (要求不能使用循环for while)
最终目标: useradd stu01;echo 123456|passwd --stdin stu01 useradd stu02;echo 123456|passwd --stdin stu02 ...