类的层次结构有两种基本的构造方式  自顶向下  自底向上

基类的保护成员是指允许派生类的方法代码访问,而不是指通过派生类的对象访问

如果基类中的字段通过公有且可读写的属性进行了封装,那么建议将字段定义为私有的,这样包括其派生类在内的所有其他类型都必须通过属性进行访问

隐藏基类成员

如果派生类中定义了与基类相同的成员,默认情况下基类的成员在派生类中会被隐藏,即派生类成员覆盖了基类成员   用new来修饰提高代码可读性

base 关键字,当派生类隐藏了基类成员时,base关键字就能发挥作用:直接写出的成员名表示派生类的成员,增加了base引用的成员表示被隐藏的基类成员

用base声明创建对象时调用的基类重载构造函数

虚拟方法和重载方法

 using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class Program
{
static void Main()
{
foreach (Automobile a in GetAutos())
{
a.Speak();
Console.WriteLine("{0}行驶1000公里需要{1}小时", a.Name, a.Run());
}
//Console.ReadLine();
}
static Automobile[] GetAutos()
{
Automobile[] autos = new Automobile[];
autos[] = new Bus("客车", );
autos[] = new Truck("东风卡车", );
autos[] = new Truck("黄河卡车", );
autos[] = new Automobile("汽车", , );
return autos;
}
} public class Automobile
{
private string name;
public string Name
{
get { return name; }
} private float speed;
public float Speed
{
get { return speed; }
} private float weight;
public float Weight
{
get { return weight; }
set { weight = value; }
} public Automobile(string name, float speed, float weight)
{
this.name = name;
this.speed = speed;
this.weight = weight;
} public virtual float Run(float distance)//虚拟方法
{
return distance / speed;
} public virtual void Speak()
{
Console.WriteLine("汽车鸣笛……");
}
}
public class Bus : Automobile
{
private int passangers;
public int Passangers
{
get { return passangers; }
set { passangers = value; }
}
public Bus(string name, int passangers)
: base(name, , )
{
this.passangers = passangers;
}
public override void Speak()
{
Console.WriteLine("嘀……嘀……");
}
} public class Truck : Automobile
{
private float load;
public float Load
{
get { return load; }
set { load = value; }
}
public Truck(string name, int load)
: base(name, , )
{
this.load = load;
}
public override float Run(float distance)//重载方法
{
return ( + load / Weight / ) * base.Run(distance);
}
public override void Speak()//重载方法
{
Console.WriteLine("叭……叭……");
}
} }

抽象类和抽象方法(抽象类不能直接用new创建对象,但可以与派生类的实例相关联)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class Program
{
static void Main()
{
Vehicle v1 = new Train();
v1.Speak();
Console.WriteLine("行驶1000公里需{0}小时", v1.Run());
v1 = new Truck(, );
v1.Speak();
Console.WriteLine("行驶1000公里需{0}小时", v1.Run());
Console.ReadLine();
}
} public abstract class Vehicle
{
private float speed;
public float Speed
{
get { return speed; }
} public virtual float Run(float distance)
{
return distance / speed;
} public abstract void Speak();//抽象方法:无执行代码 public Vehicle(float speed)
{
this.speed = speed;
}
} public class Train : Vehicle
{
public Train()
: base()
{ } public override void Speak()
{
Console.WriteLine("呜……");
}
} public abstract class Automobile:Vehicle
{
public Automobile(float speed):base(speed)
{ } public override abstract void Speak();//重载+抽象
} public class Truck : Automobile
{
private float weight;
public float Weight
{
get { return weight; }
} private float load;
public float Load
{
get { return load; }
} public Truck(int weight, int load)
: base()
{
this.weight = weight;
this.load = load;
} public override float Run(float distance)
{
return ( + load / Weight / )* base.Run(distance);
} public override void Speak()
{
Console.WriteLine("叭……叭……");
}
}
}

密封类和密封方法

一些类型不允许或是不需要再有派生类型   sealed   密封类是对类继承的截止   密封方法是对类继承中方法重载的截止

 sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class Program
{
static void Main()
{
Student s1=new Student(,"王小红");
Console.WriteLine(s1);
Student s2=new Graduate(,"王晓红","张大伟");
Console.WriteLine(s2);
Console.WriteLine(s1.Equals(s2));
Console.ReadLine();
}
} public class Student
{
private string name;
public string Name
{
get { return name; }
} private int id;
public int ID
{
get { return id; }
} public Student(int id, string name)
{
this.id = id;
this.name = name;
} public override string ToString()
{
return string.Format("学号{0},姓名{1}", id, name);
} public sealed override bool Equals(object obj)
{
if (obj is Student && ((Student)obj).id == this.id)
return true;
else
return false;
}
} public class Graduate : Student
{
private string supervisor;
public string Supervisor
{
get { return supervisor; }
set { supervisor = value; }
} public Graduate(int id, string name, string supervisor)
: base(id, name)
{
this.supervisor = supervisor;
} public override string ToString()
{
return base.ToString() + ",导师:" + supervisor;
}
}
}

2015 5.16 C# 继承和多态的更多相关文章

  1. 多态 Java 2015/9/16

    多态:http://www.cnblogs.com/chenssy/p/3372798.html     多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定, ...

  2. Objective-C中的继承和多态

    面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多 ...

  3. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

  4. python基础——继承和多态

    python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...

  5. [转]Java中继承、多态、重载和重写介绍

    什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上 ...

  6. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  7. 《JAVA程序设计与实例》记录与归纳--继承与多态

    继承与多态 概念贴士: 1. 继承,即是在已经存在的类的基础上再进行扩展,从而产生新的类.已经存在的类成为父类.超类和基类,而新产生的类成为子类或派生类. 2. Java继承是使用已存在的类的定义作为 ...

  8. c语言实现封装、继承和多态

    1.  概述 C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是 ...

  9. [ Java学习基础 ] Java的继承与多态

    看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...

随机推荐

  1. QCA4002/QCA4004 为主流家电和消费电子产品推出低功耗Wi-Fi平台

    美国高通公司日前宣布,其子公司高通创锐讯推出全新芯片系列,这是低功耗Wi-Fi解决方案系列的一部分,可连接组成物联网的各种设备.QCA4002和QCA4004网络平台在芯片上纳入IP堆栈及完整的网络服 ...

  2. sshuttle基于VPN的透明代理,安全连接

    sshuttle基于VPN的透明代理, 通过 ssh 创建一条从你电脑连接到任何远程服务器的 VPN 连 sudo sshuttle -r username@sshserver 0.0.0.0/0 - ...

  3. Twitter模块开发

    Twitter模块开发 关于Twitter这一块,自发这篇博文之后有很多人问我,有的验证成功了不跳转,或者其它原因什么的 =======我看了一下,这篇博文里面有写呀,下面以红色粗体文字注明一下 Tw ...

  4. android插件化-apkplugdemo源代码阅读指南-10

    阅读本节内容前可先了解 apkplug基础教程 本教程是基于apkplug V1.6.8 版本号编写  最新开发方式以官网为准 可下载最新的apkplugdemo源代码http://git.oschi ...

  5. SICP 习题 (1.10)解题总结

    SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就 ...

  6. Oracle存储过程返回一张表数据

    在oracle数据库中你要在程序里得到一张表的数据就必须先创建游标和SQL Service不一样. --创建游标create or replace package pkg_Dataas type re ...

  7. 64位windows8.1编译openjdk8

    首先下载openjdk8http://hg.openjdk.java.net/jdk8/jdk8/这里用到版本管理工具Mercurial,与git有些类似,不了解的话可以查一下.clone后,里面有个 ...

  8. BZOJ 1212: [HNOI2004]L语言( dp + trie )

    因为单词很短...用trie然后每次dp暴力查找...用哈希+dp应该也是可以的.... ------------------------------------------------------- ...

  9. 【Android】Handler的应用(一):从服务器端加载JSON数据

    最终目的 以JSON的形式,将数据存入服务器端. 在Android中,以Handler加载显示大批量文字. 在此以加载金庸小说<天龙八部(新修版)>为例(2580480 字节). 以tom ...

  10. win7 ie10输入网址显示无法显示此页问题的解决

    忽然又一天,非常奇怪,所有的浏览器都无法访问网页,直接输入IP也是不行. 本人试过各种方法,包括用360进行修复:清除%temp%下文件:看是否设错了dns, 升级和修复IE,重新注册ie相关的dll ...