using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态
{
class Program
{
static void Main(string[] args)
{
//员工9点打卡, 经理11点打卡,程序员不打卡
Employee emp = new Employee();
emp.Daka();
Manager man = new Manager();
man.Daka();
Programer pro = new Programer();
pro.Daka(); Console.WriteLine();
//和上面的一样
Employee[] emps = { emp, man, pro };
for (int i = 0; i < emps.Length;i++ )
{
//if(emps[i] is Manager)
//{
// ((Manager)emps[i]).Daka();
//}
//else if(emps[i] is Programer)
//{
// ((Programer)emps[i]).Daka();
//}
//else
//{
// emps[i].Daka();
//}
emps[i].Daka();
emps[i].Say();
emps[i].Speak("Hello bad cat");
} //抽象类不能创建对象,不能被实例化
//Person per = new Person(); Console.ReadKey(); } } //如果父类的方法没有默认实现,并且父类不需要被实例化
//这时可以考虑将父类定义成一个抽象类
abstract class Person
{
//抽象类不能创建对象
//抽象类中可以含有字段、实函数和虚函数等普通成员,可以不被子类重写
public string Name { get; set; }
public int Age { get; set; } public void Say()
{
Console.WriteLine("hello");
} //虚函数,可以实现,可以不实现
public virtual void Daka()
{
Console.WriteLine("virtual hello");
} //如果用户定义了自己的构造函数,而在子类继承时调用的是原先的默认的无参构造函数
//因此要再定义一个无参的构造函数
public Person(string name,int age)
{
this.Name = name;
this.Age = age;
} //抽象类有构造函数,虽然不能被实例化
public Person()
{ } //抽象类中可以具有抽象成员,并且不能是private
//抽象成员必须标记为abstract,并且不能在抽象类中实现
//抽象成员必须在抽象类中
public abstract void SayHi(); //带有参数的抽象成员
public abstract void Speak(string words);
} //子类也是抽象类,可以不实现父类的抽象成员
abstract class test:Person
{ }
//如果父类的方法有默认实现,并且父类需要被实例化
//可将父类定义成一个普通类,用虚方法实现多态
//对于继承抽象类的子类,必须将父类中的抽象成员都重写
//除非子类也是抽象类
class Employee:Person
{
//public override void Daka()
//{
// Console.WriteLine("9点打卡");
//}
//没有实现时运行Person中的virtual hello
public override void SayHi()
{ } public override void Speak(string words)
{
Console.WriteLine(words);
}
} //如果抽象类继承抽象类,并且可以不实现抽象类中的抽象函数
abstract class MyEmployee:Person
{ } class Manager : Employee
{
public override void Daka()
{
Console.WriteLine("11点打卡");
}
} class Programer : Employee
{
public override void Daka()
{
Console.WriteLine("不打卡");
}
}
}

 

总结 

1.抽象成员必须标记为abstract,并且不能有任何实现。
2.抽象成员必须在抽象类中。
3.抽象类不能被实例化

4.子类继承抽象类后,必须把父类中的所有抽象成员都重写。
(除非子类也是一个抽象类,则可以不重写)

5.抽象成员的访问修饰符不能是private

6.在抽象类中可以包含实例成员。
并且抽象类的实例成员可以不被子类实现

7.抽象类是有构造函数的。虽然不能被实例化。

8、如果父类的抽象方法中有参数,那么。继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数。

如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候 也必须要传入返回值。

======
如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。

如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。

练习

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; /*
* 模拟将外部的移动设备查到电脑上进行读写
* U 盘read、write
*
* 移动硬盘read、write
*
* MP3 read write playmusic
*/
namespace 抽象类练习
{
class Program
{
static void Main(string[] args)
{
UDisk udisk = new UDisk();
MobileDisk mdisk = new MobileDisk();
Mp3 mp3 = new Mp3(); Computer cpu = new Computer();
cpu.ds = udisk;
cpu.CpuWrite(cpu.ds);
cpu.CpuRead(cpu.ds);
Console.WriteLine(); Telephone tel = new Telephone();
tel.ds = mdisk;
tel.TelWrite();
tel.TelRead();
Console.ReadKey();
}
} abstract class Disk
{
public abstract string Read();
public abstract void Write(string str);
} class UDisk:Disk
{
public override string Read()
{
Console.WriteLine("U Read");
string str = "U Read";
return str;
} public override void Write(string str)
{
Console.WriteLine("U write" + str);
}
} class MobileDisk:Disk
{
public override string Read()
{
Console.WriteLine("MobileDisk Read");
string str = "MobileDisk Read";
return str;
} public override void Write(string str)
{
Console.WriteLine("MobileDisk Write"+str);
}
} class Mp3:Disk
{
public override string Read()
{
Console.WriteLine("Mp3 Read");
string str = "Mp3 Read";
return str;
} public override void Write(string str)
{
Console.WriteLine("Mp3 Write"+str);
} public void PlayMusic()
{
Console.WriteLine("Mp3 is playing music");
}
} class Computer
{
public Disk ds { get; set; }
public void CpuRead(Disk disk)
{ string str = disk.Read();
//
} public void CpuWrite(Disk disk)
{ string str = "Cpu ";
disk.Write(str);
} public Computer()
{
Console.WriteLine("Cpu:");
}
} class Telephone
{
public Disk ds { get; set; }
public void TelRead()
{
string str = ds.Read();
//Console.WriteLine(str);
} public void TelWrite()
{
string str = "Tel ";
ds.Write(str);
} public Telephone()
{
Console.WriteLine("Tel:");
}
}
}

  

抽象类 C#的更多相关文章

  1. PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程

    PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...

  2. 从接口、抽象类到工厂模式再到JVM来总结一些问题

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...

  3. 抽象类 VS 接口

    引言 接口和抽象类是面向对象编程(OOP, Object Oriented programming)中两个绕不开的概念,二者相似而又有所不同.接下来,我们来了解二者的概念并比较它们的异同. 什么是抽象 ...

  4. java抽象类和接口

    面向对象设计过程中重要的一点是如何进行抽象,即把"问题空间"中的元素与"方案空间"中的元素建立理想的一对一的映射关系.抽象类和接口便是抽象过程中的产物.     ...

  5. Java之继承、抽象类、接口篇

    一.继承(extends) 什么是继承? 继承是对现实生活中的"分类"概念的一种模拟. 狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是"继承" ...

  6. php中抽象类与接口的概念以及区别

    php里面的接口类,抽象类到底有什么用呢? 刚接触php的时候,觉得这个东西没什么用,其实这些东西还是有一定的作用的,下面我就简单的说说. 1.php 接口类:interface 其实他们的作用很简单 ...

  7. java基础1.-------抽象类,抽象方法

    抽象类:抽象类不能实例化,类中的方法必须经过子类的重写实现 类里的方法是public修饰时,子类可重写也可不重写 类的方法是abstract修饰时,方法是抽象方法,子类必须重写该方法 类的方法用fin ...

  8. java 中抽象类和接口的五点区别?

    1.一个类可以实现多个接口 ,但却只能继承最多一个抽象类. 2.抽象类可以包含具体的方法 , 接口的所有方法都是抽象的. 3.抽象类可以声明和使用字段 ,接口则不能,但接口可以创建静态的final常量 ...

  9. (转)深入理解Java的接口和抽象类

    原文地址: http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP ...

  10. Java中接口和抽象类的区别

    经常看到这样的问题,就是问这两个的区别,我这也总结一下: 1,宏观上说,一个是类,一个是接口,类只支持单一继承,接口支持多个继承 2,微观上说,就是从内部来说 a,成员变量方面 接口可以包含方法,属性 ...

随机推荐

  1. python3 练习题100例 (六)

    题目六:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……. #!/usr/bin/env python3 ...

  2. Go编写一个比特币交易自动出价程序

    语言环境为>=go1.10 go语言环境不多说 实现目的能与BitMEX api进行交互自动交易,目前虚拟币平台很多,平台API实现也很容易.后续会加上其它平台和自动交易算法策略,具体看平台交易 ...

  3. Qt——styleSheet

    1.两个地方调用 QWidget::setStyleSheet() QApplication::setStyleSheet() 2.基本语法 selector {attribute : value} ...

  4. python的第一个程序“Hello,World”,传闻要想学好新语言....

    传闻要想学好新语言,第一个程序必须是“Hello,World”...O(∩_∩)O哈哈~ 下面附上代码: # -*- coding:utf-8 -*- print("Hello,World& ...

  5. Git Status 中文乱码解决

    现象: jb@H39:~/doc$ git statusOn branch masterYour branch is up-to-date with 'origin/master'. Untracke ...

  6. 北京Uber优步司机奖励政策(2月20日~2月21日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. C#学习第一阶段——语法基础

    C#是一门面向对象的编程语言.在面向对象的程序设计方法中,程序由各种相互交互的对象组成.相同种类的对象具有相同的属性,或者说是在相同的class 中的.       例如,以矩形为例,它具有高(len ...

  8. CF 314 E. Sereja and Squares

    E. Sereja and Squares http://codeforces.com/contest/314/problem/E 题意: 给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种 ...

  9. jquery实现倒计时功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 韩国KT软件NB-IOT开发记录V150(2)FOTA差分包生成

    1. 生成差分包