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

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

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

隐藏基类成员

如果派生类中定义了与基类相同的成员,默认情况下基类的成员在派生类中会被隐藏,即派生类成员覆盖了基类成员   用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. Oracle EBS-SQL (INV-1):库存货位列表.sql

    select inventory_location_id, organization_id, description, subinventory_code, segment1 inventory_lo ...

  2. intent传对象

    intent还有一个很好用的地方,就是传输对象,但要注意的是这里的传输只是将对象复制了一份通过intent进行传递,并不能达到实时更新的效果,也就是这个对象等偏重于“读”.intent对这个对象有着严 ...

  3. Java安全学习

    http://blog.csdn.net/wbw1985/article/details/5506515 http://blog.csdn.net/wbw1985/article/details/60 ...

  4. html 基本标签

    HTML 基本标签 Web 服务器工作原理 HTML 注释 HTML 基本标签 http://192.168.32.36:8080/scan/demo.html scan 表示你的应用资源目录 HTM ...

  5. bash代码

    bash代码: #!/bin/bash MySQLSTARTUP="/data/3306/mysql" DbProcessCount=`ps -ef|grep mysql|grep ...

  6. js获取宽度设置thickbox百分比

    thickbox的宽高不好设为百分比,这样遇到不同的尺寸的电脑就会出现问题. 怎么做呢? 通过js来处理. <script type="text/javascript"> ...

  7. poj1657---chessboard

    对棋盘横纵坐标的解读 str1="f3" str2="e9" x=abs(str1[0]-str2[0]) y=abs(str1[1]-str1[1]) 如果x ...

  8. Openstack 的 RPC使用。

    大家都已经很熟悉了RPC了. 比如说nfs就是采用的RPC通信. 尤其SUN RPC 已经成为了C语言开发的经典一种进程间调用机制. openstack 的RPC 机制, 是基于AMQP 活着其他高级 ...

  9. _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

    iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 ...

  10. asp.net MVC Razor 语法(3)

    编程逻辑:执行基于条件的代码. If 条件 C# 允许您执行基于条件的代码. 如需测试某个条件,您可以使用 if 语句.if 语句会基于您的测试来返回 true 或 false: if 语句启动代码块 ...