不要在对抽象类接口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() { ...
随机推荐
- JavaWeb -学生信息管理实践(JDBC+web+三层架构+DBUtil构造思路)
前言: 1 该程序使用动态web项目 2 该程序使用SQL server需导入对应包( 具体可看前篇----JDBC的使用) 3 三层架构思想: ①表示层 前台:jsp/html等 作为前台与用户交互 ...
- poj1017----模拟
题目大意: 现有1*1,2*2,3*3,4*4,5*5,6*6规格的产品若干个(高度都为h),问最少需要多少个 6*6*h的箱子把这些产品都装完 输入:每组测试数据共6个整数,分别代表1*1,...6 ...
- Highcharts纯Javascript图表使用讲解
Highcharts提供大量的选项配置参数,您可以轻松定制符合用户要求的图表,目前官网只提供英文版的开发配置说明文档,而中文版的文档网上甚少,且零散不全.这里,我把Highcharts常用的最核心的参 ...
- iOS 模拟不同的字体大小
 真的是神器!! 参考 Creating Self-Sizing Table View Cells
- layer弹出层设置相对父级元素定位
layer弹出层默认是相对body固定定位的,可是项目中一般需要相对某个盒子相对定位,下面是个加载弹层例子: var loadIndex = layer.open({ type: 3, //3 表示加 ...
- 【NOIP2013】 华容道 bfs预处理+bfs
这一题我们考虑一个最裸的算法: 我们设$dp[i][j][k][l]$表示当前棋子在$(i,j)$且空格在$(k,l)$时的最小步数 然后显然随便转移一下就好了,时间复杂度为$O(q(nm)^2)$. ...
- POJ 1118
#include<iostream> #include<set> #include<stdio.h> #include<math.h> #include ...
- java修改AD域用户密码使用SSL连接方式
正常情况下,JAVA修改AD域用户属性,只能修改一些普通属性, 如果要修改AD域用户密码和userAccountControl属性就得使用SSL连接的方式修改, SSL连接的方式需要操作以下步骤: 1 ...
- 散列表碰撞处理、开链法、HashTable散列
散列表碰撞处理.开链法.HashTable散列 /** * 散列表碰撞处理.开链法.HashTable散列. * 将数组里的元素位置,也设置为数组,当两个数据的散列在同一个位置时, * 就可以放在这个 ...
- js设置全局变量 ajax中赋值
js设置全局变量,在ajax中给予赋值赋值不上问题解决方案 方案一. //在全局或某个需要的函数内设置Ajax异步为false,也就是同步. $.ajaxSetup({async : false}); ...