2015 5.16 C# 继承和多态
类的层次结构有两种基本的构造方式 自顶向下 自底向上
基类的保护成员是指允许派生类的方法代码访问,而不是指通过派生类的对象访问
如果基类中的字段通过公有且可读写的属性进行了封装,那么建议将字段定义为私有的,这样包括其派生类在内的所有其他类型都必须通过属性进行访问
隐藏基类成员
如果派生类中定义了与基类相同的成员,默认情况下基类的成员在派生类中会被隐藏,即派生类成员覆盖了基类成员 用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# 继承和多态的更多相关文章
- 多态 Java 2015/9/16
多态:http://www.cnblogs.com/chenssy/p/3372798.html 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定, ...
- Objective-C中的继承和多态
面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多 ...
- 2、C#面向对象:封装、继承、多态、String、集合、文件(上)
面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...
- python基础——继承和多态
python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...
- [转]Java中继承、多态、重载和重写介绍
什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上 ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- 《JAVA程序设计与实例》记录与归纳--继承与多态
继承与多态 概念贴士: 1. 继承,即是在已经存在的类的基础上再进行扩展,从而产生新的类.已经存在的类成为父类.超类和基类,而新产生的类成为子类或派生类. 2. Java继承是使用已存在的类的定义作为 ...
- c语言实现封装、继承和多态
1. 概述 C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是 ...
- [ Java学习基础 ] Java的继承与多态
看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ---- ...
随机推荐
- centeros resin安装脚本启动
公司用的服务器是resin+apache #! /bin/sh # # See contrib/init.resin for /etc/rc.d/init.d startup script # # r ...
- Delphi通过IE窗口句柄获取网页接口(IWebBrowser2) good
主要用到的是MSAA(Microsoft Active Accessibility) 函数:ObjectFromLResult,该函数在动态链接库 oleacc.dll 中定义. uses SHDoc ...
- 11417 - GCD
Problem A GCD Input: Standard Input Output: Standard Output Given the value of N, you will have to f ...
- Unix/Linux环境C编程入门教程(13) 开发环境搭建VMware软件安装
VMware(中文名威睿",纽约证券交易所"代码:VMW) 虚拟机软件,是全球桌面到数据中心虚拟化解决方案的领导厂商.全球不同规模的客户依靠VMware来降低成本和运营费用.确保业 ...
- 2016 Multi-University Training Contest 8 总结
回家之后一堆的事情,最后两场多校都没怎么参加,终于现在有些时间可以把第八场的总结补上. 欣君开局看出06题公式,我照着写,一A,差一分钟拿到FB,有点可惜. 磊哥觉得11题水题,写了一下,一A. 欣君 ...
- poj2196---Specialized Four-Digit Numbers
#include <stdio.h> #include <stdlib.h> int main() { int i,sum,sumOfH,sumOfd,tmp1,tmp2,tm ...
- 网易云课堂_C语言程序设计进阶_第6周:程序结构
6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...
- 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)
前言 本章将实现非常实用的功能——下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...
- go-vim配置
一.环境准备: 系统环境说明: [root@docker golang]# cat /etc/redhat-release CentOS Linux release (Core) [root@dock ...
- .NET中TextBox控件设置ReadOnly=true后台取不到值 三种解决方法
方法一:不设置ReadOnly属性,通过onfocus=this.blur()来模拟,如下: <asp:TextBox ID="TextBox1" runat="s ...