抽象类 C#
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#的更多相关文章
- PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程
PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...
- 从接口、抽象类到工厂模式再到JVM来总结一些问题
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...
- 抽象类 VS 接口
引言 接口和抽象类是面向对象编程(OOP, Object Oriented programming)中两个绕不开的概念,二者相似而又有所不同.接下来,我们来了解二者的概念并比较它们的异同. 什么是抽象 ...
- java抽象类和接口
面向对象设计过程中重要的一点是如何进行抽象,即把"问题空间"中的元素与"方案空间"中的元素建立理想的一对一的映射关系.抽象类和接口便是抽象过程中的产物. ...
- Java之继承、抽象类、接口篇
一.继承(extends) 什么是继承? 继承是对现实生活中的"分类"概念的一种模拟. 狮子拥有动物的一切基本特性,但同时又拥有自己的独特的特性,这就是"继承" ...
- php中抽象类与接口的概念以及区别
php里面的接口类,抽象类到底有什么用呢? 刚接触php的时候,觉得这个东西没什么用,其实这些东西还是有一定的作用的,下面我就简单的说说. 1.php 接口类:interface 其实他们的作用很简单 ...
- java基础1.-------抽象类,抽象方法
抽象类:抽象类不能实例化,类中的方法必须经过子类的重写实现 类里的方法是public修饰时,子类可重写也可不重写 类的方法是abstract修饰时,方法是抽象方法,子类必须重写该方法 类的方法用fin ...
- java 中抽象类和接口的五点区别?
1.一个类可以实现多个接口 ,但却只能继承最多一个抽象类. 2.抽象类可以包含具体的方法 , 接口的所有方法都是抽象的. 3.抽象类可以声明和使用字段 ,接口则不能,但接口可以创建静态的final常量 ...
- (转)深入理解Java的接口和抽象类
原文地址: http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP ...
- Java中接口和抽象类的区别
经常看到这样的问题,就是问这两个的区别,我这也总结一下: 1,宏观上说,一个是类,一个是接口,类只支持单一继承,接口支持多个继承 2,微观上说,就是从内部来说 a,成员变量方面 接口可以包含方法,属性 ...
随机推荐
- Python2018秋招(笔者亲身经历)
毕业即失业,苦逼的大四狗伤不起哟. 又到了一年一度的秋招了,笔者也在拉勾,智联,boss直聘注册了,投了50份简历,3个面试,然而全挂了. 笔者痛定思痛决定将自己的经历贴出,希望可以帮到要面试的同学. ...
- php7+apache2.4+mysql 环境配置(window环境)
最近,小主从事PHP开发.特将最近如何搭建php7的过程记录在此!希望有需要,可以借鉴!( 电脑必须win7 sp1以上, .netframework4 ) Windows7安装php7,Win7+p ...
- 第三节 循环链表的Go语言实现
一.什么是循环链表 循环链表的节点形成一个圈.把单链表的尾巴指向开头形成单循环链表.把双向链表的尾巴与开头链接起来就形成双向循环链表.使用循环链表可以不断的绕圈寻找所需要的数据,而不需要像单链表那样每 ...
- (数据科学学习手札45)Scala基础知识
一.简介 由于Spark主要是由Scala编写的,虽然Python和R也各自有对Spark的支撑包,但支持程度远不及Scala,所以要想更好的学习Spark,就必须熟练掌握Scala编程语言,Scal ...
- 毕业 迷茫 继续OR放弃?
终于还是回学校拿了毕业证书,请了两个小时的假,连同中午吃饭的时间,顺利地从班主任手中拿到了毕业证书,大学就这样结束啦,人生也来到了一个新的转折点,但是每天的每天,我都是异常迷茫,异常胆怯,异常无语. ...
- 青岛Uber优步司机奖励政策(8/10-8/16)
亲爱的Uber青岛优步的大司机朋友们,又到了每周发布奖励细则的时刻啦!下一周的奖励与上周有所不同,请一定要仔细按照自己的情况阅读!另外,之前参与过投票并表示想加入新小时保底政策的老司机朋友们从本周起, ...
- GDAL2.1.1库在Ubuntu14.04下编译时遇到的问题处理方法
不用作任何调整,直接在Linux下编译GDAL2.1.1源码的步骤是: $ ./configure $ make $ make install 非常简单,这样也能正常生成gdal动态库.静态库,如果想 ...
- 4946: [Noi2017]蔬菜
4946: [Noi2017]蔬菜 http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf 分析: 贪心. 首先可以将一个蔬菜拆成两个,一个是有加成 ...
- NB-IOT修改KV值的方法
1. 安装UEConfigurationEditor-3.22.0.14.msi,之后打开一个fwpkg文件,如下图 2. 找到需要修改的KV值,修改之后,点击Apply changes,应用修改,然 ...
- html div内第二行文字显示不下的时候才用省略号代替 css实现
有时候文字太多,但为了美观想要在第二行的时候才显示省略号,而不是第一行超出马上就出现省略号 下面是css代码: overflow:hidden;text-overflow: ellipsis;//显示 ...