03---Net基础加强
多态---虚方法 (子类可以选择重写或者不重写)
class Program
{
static void Main(string[] args)
{
Chinese cn1 = new Chinese("叶长种");
Chinese cn2 = new Chinese("王少伟");
Japanese jp1 = new Japanese("小野妹子");
American us = new American("勒布朗");
Person[] pers = {
cn1, cn2,jp1,us
};
for (int i = ; i < pers.Length; i++)
{
Console.Write(pers[i].Name);
pers[i].ShowNationality();
}
Console.ReadKey();
}
} public class Person
{ public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public string Email
{
get;
set;
} public virtual void ShowNationality() //虚方法virtual
{
Console.WriteLine("........");
}
} public class Chinese : Person
{
public Chinese(string name)
{
this.Name = name;
}
public override void ShowNationality() // 子类重写父类方法时,使用的关键字是overrider
{
Console.WriteLine("【中国】");
}
} public class Japanese : Person
{
public Japanese(string name)
{
this.Name = name;
}
public override void ShowNationality()
{
Console.WriteLine("【日本】");
} } public class American : Person
{
public American(string name)
{
this.Name = name;
}
public override void ShowNationality()
{
Console.WriteLine("【美国】");
}
}
举例:
class Program
{
static void Main(string[] args)
{
Employee emp = new Employee();
emp.DaKa();
Manager man = new Manager();
man.DaKa();
Console.ReadKey();
}
} public class Employee
{ public virtual void DaKa() //虚方法virtual
{
Console.WriteLine("员工8:30打卡。");
}
} public class Manager : Employee
{ public override void DaKa() // 子类重写父类方法时,使用的关键字是overrider
{
Console.WriteLine("经理9:00打卡");
}
}
虚方法特点总结:
1.在父类中把需要设置为虚方法的方法前加Virtual标记
2.虚方法在父类中必须有实现
3.子类继续父类后可以选择重写也可以选择不重写
4.当子类重写父类中的方法的时候,必须保证重写后的方法与原方法的访问修饰符,返回值类型,方法名,参数列表完全一致
5.当方法的标记是virtual或者override的时候都可以重写
静态
class Program
{
static void Main(string[] args)
{
Myclass mc = new Myclass(); //类中的静态成员不能通过对象来访问,只能通过“类名”来访问
//Myclass.name = "aaaa";
//Myclass.Say(); //静态成员在整个程序中是共享的,一个地方改变后,所有使用到的地方都发生改变
//静态成员直到程序退出时才会释放,在静态成员中不能使用this
//M1();
//Console.WriteLine(Myclass.name);
//Console.ReadKey(); MyTool.age = ;
MyTool.Show();
Console.ReadKey(); } static void M1()
{
Myclass.name = "aaaa";
} } //实例类(普通类)
class Myclass
{
//静态成员
public static void Say()
{
Console.WriteLine("hello");
} //静态成员
public static string name; //实例成员
public int Age
{
get;
set;
}
} static class MyTool
{
//静态构造函数,在第一次使用该类前调用(并且只调用一次)
//静态构造函数不能有修饰符
//静态构造函数不能有参数(所以也不能重载)
//主要是因为静态构造函数是系统调用的
static MyTool()
{
Console.WriteLine("第一次调用");
}
public static void Show()
{
Console.WriteLine("show");
}
public static int age;
}
系统中 Math、Console、Convert等都是静态类!
静态类不能被其它类继承,静态成员亦不能被继承(访问的是同一个)
静态类只能继承Object类。(静态类不能继承自其它类)
继承(多态),静态本身就是相反的。
静态类不能实现任何接口,(因为接口中的成员都是实例成员)
sealed 密封类,不能被继承。 sealed是关键字!
静态类的本质就是abstract+sealed !
静态类,静态类成员:
1.静态成员在整个应用中共享同一个值。
2.只有当程序退出后,才释放静态资源的内存
3.静态成员只能通过类名来访问,不能通过对象名访问。
4.静态类不能被实例化
在实例类中使用静态成员:当该类需要被实例化时,并且该类中有某个成员是大家都共享的,此时,可以将该成员标记为static静态的。
静态类:当使用一些工具类的时候(都是一些工具方法),可以使用静态类来把相关的方法都封装到一个类中,方便调用。
class Program
{
static void Main(string[] args)
{
//1.将一个类标记为“密封类”
//2.用在方法重写
}
} //public sealed class Person
//{ //} //public class Chinese : Person //不能继承 string是个密封类,是引用类型,滥用继承,会使系统崩溃!
//{ //}
public class Person
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public string Email
{
get;
set;
}
public virtual void Say()
{
Console.WriteLine("say.....");
}
} public class Chinese : Person
{ public override void Say()
{
Console.WriteLine("Chinese中的Say");
}
} public class HeiBeiRen : Chinese
{
//终止继续重写
public sealed override void Say()
{
Console.WriteLine("河北人。。");
}
} public class ShiJiaZhuang : HeiBeiRen
{
//不能再重写方法Say()
}
多态:为了把程序的可扩展性,把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化!
多态就是指不同对象收到不同消息时,会产生不同的行为,同一个类在不同的场合下表现出不同的行为特征!
开放封闭原则(对修改封闭,对扩展开放)
ToString()方法
class Program
{
static void Main(string[] args)
{
string s = "aaaa";
Console.WriteLine(s.ToString());
int n = ;
Console.WriteLine(n.ToString());
Console.ReadKey();
}
}
里氏替换原则:
1.父类引用指向子类对象Person p=new Chinese();(隐式类型转换)
2.父类对象不能够替换子类Chinese c=(Chinese)new Person();(X)
is-a:可以用来验证继承关系是否合理(can-do验证实现接口是否合理)
if(obj is 类型A) //obj是父类类型对象,“类型A” 是子类类型
使用as进行类型转换,如果转换成功则返回成功后的对象,如果转换失败就返回NULL;
class Program
{
static void Main(string[] args)
{ Person p = new American("叶长种");
Chinese cn = p as Chinese;
//使用as进行类型转换,如果转换成功则返回成功后的对象,如果转换失败就返回NULL;
if (cn != null)
{
Console.WriteLine(cn.Name);
} Console.ReadKey();
}
} public class Person
{
public Person(string name)
{
this.Name = name;
} public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public string Email
{
get;
set;
}
}
public class Chinese : Person
{
public Chinese(string name)
: base(name)
{ }
} public class American : Person
{
public American(string name)
: base(name)
{ }
}
实现多态的方法
1.虚方法Virtual,子类重写父类中的方法。
2.抽象类abstract,子类重写父类中的方法。
3.接口,实现接口的类,将接口中的方法实现。
使用虚方法:
class Program
{
static void Main(string[] args)
{ Person p = new Chinese();
p.Say();
Console.ReadKey();
}
} public class Person
{ public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public string Email
{
get;
set;
}
public virtual void Say()
{
Console.WriteLine("Person类中的Say");
}
}
public class Chinese : Person
{
public override void Say()
{
Console.WriteLine("Chinese中的Say()");
}
} public class American : Person
{
public override void Say()
{
Console.WriteLine("American中的Say()");
}
}
使用抽象
class Program
{
static void Main(string[] args)
{ Person p = new Chinese();
p.Say();
Console.ReadKey();
}
}
//抽象类的特点:
//1.抽象类不能被实例化。
//2.抽象类中可以有实例成员,也可以有抽象成员
public abstract class Person //抽象成员只能出现在抽象类中。所以要把当前类也变为抽象的
{ public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public string Email
{
get;
set;
}
//1. 关键字abstract
//2.抽象成员不能有任何实现代码
//3.抽象成员只能出现在抽象类中。所以要把当前类也变为抽象的
//4.与虚方法不同,抽象方法子类必须重写(除非子类也是抽象的)
public abstract void Say();
}
public class Chinese : Person
{
public override void Say()
{
Console.WriteLine("Chinese中的Say()");
} } public class American : Person
{
public override void Say()
{
Console.WriteLine("American中的Say()");
}
} //public class Japanese : Person //与虚方法不同,抽象方法子类必须重写
//{ //}
抽象类案例1
class Program
{
static void Main(string[] args)
{ Dog a = new Dog();
a.Eat();
a.Bark();
Console.ReadKey();
}
} public abstract class Animal
{
public abstract void Eat();
public abstract void Bark();
}
public class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("我吃骨头");
}
public override void Bark()
{
Console.WriteLine("汪汪汪");
} } public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("我吃鱼");
}
public override void Bark()
{
Console.WriteLine("喵喵喵");
}
}
抽象案例2:
class Program
{
static void Main(string[] args)
{ Teacher teacher = new Teacher();
Student student = new Student();
student.StandUp();
teacher.SayHello();
student.SayHello();
teacher.StandUp();
Console.ReadKey();
}
} public abstract class Person
{
public abstract void SayHello();
public abstract void StandUp();
}
public class Teacher : Person
{
public override void SayHello()
{
Console.WriteLine("同学们好");
}
public override void StandUp()
{
Console.WriteLine("请坐");
} } public class Student : Person
{
public override void SayHello()
{
Console.WriteLine("老师好");
}
public override void StandUp()
{
Console.WriteLine("起立");
}
}
抽象案例3:
class Program
{
static void Main(string[] args)
{
Shape shape = new Circle();
Console.WriteLine(shape.GetArea());
Console.WriteLine(shape.GetZhouChang());
Shape shape1 = new ChangFangXing(, );
Console.WriteLine(shape1.GetArea());
Console.WriteLine(shape1.GetZhouChang());
Console.ReadKey();
}
} public abstract class Shape
{
public abstract double GetArea();
public abstract double GetZhouChang();
}
public class Circle : Shape
{
//扩展属性 半径
public double R
{
get;
set;
}
public Circle(double r)
{
this.R = r;
}
public override double GetArea()
{
return Math.PI * this.R * this.R;
}
public override double GetZhouChang()
{
return * Math.PI * this.R;
}
}
public class ChangFangXing : Shape
{ public double Width
{
get;
set;
} public double Heigh
{
get;
set;
}
public ChangFangXing(double w, double h)
{
this.Width = w;
this.Heigh = h;
}
public override double GetArea()
{
return this.Width * this.Heigh;
}
public override double GetZhouChang()
{
return * (this.Width + this.Heigh);
}
}
抽象类练习:(U盘,MP3播放器,移动硬盘三种移动设备)
可移动设备类
//可移动存储设备
public abstract class MobileDisk
{
public abstract void Read(); public abstract void Write();
}
MP3类
public class MP3 : MobileDisk
{
public override void Read()
{
Console.WriteLine("MP3读取数据...");
}
public override void Write()
{
Console.WriteLine("MP3写数据...");
}
public void PlayMusic()
{
Console.WriteLine("音乐播放中...");
}
}
U盘类
public class UDisk : MobileDisk
{
public override void Read()
{
Console.WriteLine("U盘读取数据...");
}
public override void Write()
{
Console.WriteLine("U盘写数据....");
}
}
硬盘类
public class HardDisk : MobileDisk
{
public override void Read()
{
Console.WriteLine("硬盘读取数据...");
}
public override void Write()
{
Console.WriteLine("硬盘写数据....");
}
}
计算机类
public class Computer
{
public MobileDisk Disk
{
get;
set;
} public void Read()
{
Disk.Read();
}
public void Write()
{
Disk.Write();
}
}
主程序
class Program
{
static void Main(string[] args)
{
Computer computer = new Computer(); //UDisk u1 = new UDisk();
//computer.Disk = u1; MP3 mp3 = new MP3();
computer.Disk = mp3;
computer.Read();
computer.Write();
Console.ReadKey();
}
}
抽象类练习:(橡皮鸭子,真实鸭子)
class Program
{
static void Main(string[] args)
{ }
} public abstract class Duck
{
public void swim()
{
Console.WriteLine("鸭子在水上漂...");
} public abstract void Bark();
} public class RealDuck : Duck
{ public override void Bark()
{
Console.WriteLine("嘎嘎......");
}
} public class RubberDuck : Duck
{ public override void Bark()
{
Console.WriteLine("唧唧......");
}
}
03---Net基础加强的更多相关文章
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- Docker系列03—Docker 基础入门
本文收录在容器技术学习系列文章总目录 1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. ...
- Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...
- 了不起的分支和循环03 - 零基础入门学习Python009
了不起的分支和循环03 让编程改变世界 Change the world by program while循环 说完了分支我们来说说循环,标准的while循环语法我们已经可以熟悉掌握了. 这里我们就简 ...
- DLL技术应用03 - 零基础入门学习Delphi46
DLL技术应用03 让编程改变世界 Change the world by program DLL的加载和调用 [caption id="attachment_2685" alig ...
- 03.Django基础三之视图函数
一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错 ...
- 03 . Vue基础之计算属性,组件基础定义和使用
vue组件 fetch请求组件 fetch XMLHttpRequest是一个设计粗糙的API, 配置和调用方式非常混乱,而且基于事件的异步模型写起来不友好,兼容性不好. <!DOCTYPE h ...
- 03 前端基础之JavaScript
目录 前端基础之JavaScript JavaScript JavaScript注释 变量与常量 基本数据类型 number类型 string类型 boolean类型 null与undefined类型 ...
- pl/sql programming 03 语言基础
PL/SQL 块结构 最小的有意义的代码单元叫做 块(block). 一个块是一组代码, 这个块给出了执行边界, 也为变量声明和异常处理提供了作用范围, pl/sql 准许我们创建匿名块和命名块, 命 ...
- SQL从入门到基础–03 SQLServer基础1(主键选择、数据插入、数据更新)
一.SQL语句入门 1. SQL语句是和DBMS“交谈”专用的语句,不同DBMS都认SQL语法. 2. SQL语句中字符串用单引号. 3. SQL语句中,对于SQL关键字大小写不敏感,对于字符串值大小 ...
随机推荐
- 利用 libiconv 实现汉字编码 utf-8 格式 和 gbk格式的相互转换
参考文章:http://jimmee.iteye.com/blog/2174693 关于windows上编译libiconv的库,请参见:http://www.cnblogs.com/tangxin- ...
- Spark Programming--Actions II
saveAsTextFile saveAsTextFile(path, compressionCodecClass=None) aveAsTextFile用于将RDD以文本文件的格式存储到文件系统中, ...
- Java学习-011-创建文件实例及源代码
此文源码主要为应用 Java 创建文件的源代码.若有不足之处,敬请大神指正,不胜感激! 创建文件的源代码如下所示: /** * @function 文件操作:创建文件.若文件不存在,则直接创建文件:若 ...
- 使用Aspose.Cell控件实现多个Excel文件的合并
之前有写过多篇关于使用Apose.Cell控件制作自定义模板报表和通用的导出Excel表格数据的操作,对这个控件的功能还是比较满意,而且也比较便利.忽然有一天,一个朋友说:你已经有生成基于自定义模板报 ...
- 常用jq选择器和遍历的使用
1.jq的选择器,常用有哪些? class id > ~ ul li a 2.遍历的使用(在使用用遍历节点时,我们的注意遍历在不传递参数(也就是传参),代表的是传递局部全局,也就是"* ...
- OpenGl的glMatrixMode()函数理解
glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项 ...
- Speed-BI数据分析案例:2016年8月汽车销量排行榜
据中国汽车工业协会统计分析,2016年8月,乘用车市场表现较好,当月销量环比和同比均呈较快增长.1-8月,乘用车销量总体呈稳定增长,增幅比1-7月继续小幅提升. 8月,乘用车共销售179.5 ...
- VI设置及用法
VI设置通过/etc/vim/vimrc设置vi的基本操作格式. 全局属性通过末行模式输入可临时设置. syntax on ;高亮显示 set tabstop=4 setsofttabstop=4 ; ...
- [RGEOS]绘制多边形Polygon
绘制OGIS定义的Polygon public void DrawPolygon(Polygon pol, Brush brush, Pen pen, bool clip) { gc = Graphi ...
- 前端学习——css实用技术
一,css控制文本样式 文本相关的css属性有很多,包括: color;font-size;font-weight;text-transform(大小写uppercase等);text-decorat ...