不要在对抽象类接口abstract virtual什么的混淆不清了
(最近带一个新手入门 讲这边老费力了。)
接口和抽象类不过都是类的抽象罢了,这是他们的本质,只不过人们的思维角度不同而已,一个偏向为行为契约上的抽象(接口) 一个更像大自然中的繁衍关系(抽象类)。
直接上代码:
class 抽象类
{
public static void Main(string[] args)
{
ChinesePerson c = new ChinesePerson("xx", );
c.Run();
c.Speak();
Console.WriteLine(c.Name);
Console.WriteLine(c.Age);
Console.WriteLine(c.Hobby);
Console.WriteLine("--------");
c.fight();
JiangSuPerson j = new JiangSuPerson();
j.Name = "xiaomao";
j.Age = ;
j.Run();
j.Speak();
j.fight();
j.sing();
Console.WriteLine(j.Name);
Console.WriteLine(j.Age);
Console.WriteLine(j.Hobby);
Console.WriteLine("----------");
HenanPerson h = new HenanPerson();
h.Name = "linyi";
h.Speak();
h.fight();
h.sing();
Console.ReadKey();
}
} public interface IRun
{
void Run();
} public abstract class Person : IRun
{
private string name;
private int age;
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
public abstract string Hobby { get; set; }
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
public Person()
{ }
public abstract void Speak();
public void Run()
{
Console.WriteLine("Running ~~");
}
//能够被子类重写的 只有 abstract 或virtual修饰的,
//不同在于,abstract一定要被重写,而virtual则是可以被重写 但不一定非要重写,还有就是virtual要有方法体。
public virtual void fight()
{
Console.WriteLine("fighting");
}
}
public class ChinesePerson : Person
{ public ChinesePerson(string name, int age)
: base(name, age)
{
this.Name = name;
this.Age = age;
}
public ChinesePerson()
{
}
public override void Speak()
{
Console.WriteLine("中国人说中文");
} public override string Hobby
{
get
{
return "shopping";
}
set
{
}
}
public override void fight()
{
base.fight();
Console.WriteLine("chinese gongfu fighting");
}
public virtual void sing()
{
Console.WriteLine("用中文唱歌");
}
} //继承自中国人,但是没有任何重写
public class JiangSuPerson : ChinesePerson
{ }
public class HenanPerson : ChinesePerson
{
public override void Speak()
{
Console.WriteLine("河南人说河南方言");
}
public override void sing()
{
Console.WriteLine("用河南话唱歌");
}
}
总结一下:抽象类 和接口都是类的抽象,接口更关注从行为方面来抽象,而在语法上 接口的内容必须都是没有实现的,完全等待后面的类来实现的
而在这一点上,抽象类则像是一个没有完全实现的类,他想所有普通类一样,可以拥有字段,属性,以及方法,这些都是可以有具体实现体的,
但就这样的话,他和普通类的差别只在于他不可以通过new实例化,而他的真正不同在于 他应该有abstract修饰的部分,这部分没有具体实现,必须由
由后面的实现类来具体实现。
而virtual关键字本不该属于这里的讨论范畴,他修饰的方法和普通方法几乎一样,都是有着方法体的,但是被virtual修饰的可以被子类重写。
再举个例子模拟下mvc的控制器模块
//大致模拟了MVC框架中的控制器模块的思想
class 抽象类二
{
public static void Main(string[] args)
{
IController ic;
ic = new HomeController();
ic.Execute();
Console.ReadKey();
}
} public interface IController
{
void Execute();
} public abstract class ControllerBase : IController
{
//可以选择性的重写这整个方法,而不按照所期望的分步骤
public virtual void Execute()
{
Console.WriteLine("doing some unimporting things");
ExecuteCore();
}
//这个方法则必须实现
public abstract void ExecuteCore();
}
public abstract class Controller : ControllerBase
{
public override void ExecuteCore()
{
Console.WriteLine("doing some importing things");
} //public override void Execute()
//{
// Console.WriteLine("doing the whole things");
//}
}
public class HomeController : Controller
{ }
不要在对抽象类接口abstract virtual什么的混淆不清了的更多相关文章
- 面试题之——抽象类(abstract class)与接口(interface)的区别
抽象类可以有构造方法,接口中不能有构造方法.(虽然抽象类有构造方法,但它也不能被实例化) 抽象类中可以有普通成员变量,接口中没有普通成员变量. 抽象类和接口中都可以包含静态成员变量.抽象类中的静态成员 ...
- 抽象类(abstract class)和 接口(interface)
PHP中的 抽象类(abstract class)和 接口(interface) 一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方 ...
- 面向对象_06【抽象类:abstract、接口:interface、实现:implements】
抽象类:abstract抽象:没有足够的描述功能,事物不具体的描述,却又有共性. 特点: 1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中,该类也 ...
- 抽象类(abstract class)和接口(Interface)的区别
前言 抽象类(abstract class)和接口(Interface)是Java语言中对于抽象类定义进行支持的两种机制,赋予了Java强大的面向对象能力. 二者具有很大的相似性,甚至可以相互替换,因 ...
- 抽象类(abstract)与接口(interface)的区别
如果一个类中包含抽象方法,那么这个类就是抽象类.abstract只能用来修饰类或者方法,不能用来修饰属性. 接口是指一个方法的集合,接口中的所有方法都没有方法体.接口通过关键字interface实现. ...
- 接口(interface)与抽象类(abstract class)两者的异同
首先说明一下,JDK1.8以后接口可以有默认方法和静态方法以及私有方法. 一.概念: 接口(interface):是抽象类的变体,其中所有的方法都是抽象的且不能有方法体,而且只能定义 static f ...
- 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait
[源码下载] 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait 作者:webabcd 介绍速战速决 之 PHP 类基础 抽象类 接口 trait 示例1.类的相关知识点 1(基础 ...
- Java抽象类接口、内部类题库
一. 选择题 1. Person类和Test类的代码如下所示,则代码中的错误语句是( C ).(选择一项) public class Person { public String nam ...
- 《day09---继承-抽象类-接口》
//面向对象_继承_概述---单继承_多继承. //描述学生. /* class Student { //属性. String name; int age; //行为: void study() { ...
随机推荐
- node.js async 几个函数
async.waterfallasync.seriesasync.parallelasync.auto http://my.oschina.net/huangsz/blog/176203http:// ...
- es6中箭头函数 注意点
var aaabbb = 'kkkooo' setTimeout(()=>{ var aaaa = 'kkkk'; console.log(this) },1000); 因为据我了解,箭头函数指 ...
- Ubuntu 16.04下的安装RabbitMQ
安装 添加源 echo 'deb http://www.rabbitmq.com/debian/ testing main' | sudo tee /etc/apt/sources.list.d/ra ...
- Storm Trident API
在Storm Trident中有五种操作类型 Apply Locally:本地操作,所有操作应用在本地节点数据上,不会产生网络传输 Repartitioning:数据流重定向,单纯的改变数据流向,不会 ...
- OpenRefine导入CSV文件,数据清理后导出JSON格式
第一步:选择要转换的CSV文件. 第二步:选择以逗号分割,并创建项目. 第三步:编辑,去掉特殊字符 Edit Cells > Transform... 第四步:导出文件,选择“Templatin ...
- 课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 2、10个测验题
1.What does the analogy “AI is the new electricity” refer to? (B) A. Through the “smart grid”, AI i ...
- 第12章—使用NoSQL数据库—使用MongoDB+Jpa操作数据库
使用MongoDB+Jpa操作数据库 SpringData还提供了对多种NoSQL数据库的支持,包括MongoDB;neo4j和redis.他不仅支持自动化的repository,还支持基于模板的数据 ...
- centos6.7 安装 virtualBox 再安装 centos 7
Tag: 黄色为自己实际情况需要设置的部分,绿色部分为虚拟机名称(自定义) 1.创建虚拟机VBoxManage createvm --name centos7 --ostype Linux26_64 ...
- Redis笔记(二):Redis数据类型
Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...
- Git 代码管理命令
1) 远程仓库相关命令检出仓库:$ git clone git://github.com/jquery/jquery.git查看远程仓库:$ git remote -v添加远程仓库:$ git rem ...