(最近带一个新手入门 讲这边老费力了。)

接口和抽象类不过都是类的抽象罢了,这是他们的本质,只不过人们的思维角度不同而已,一个偏向为行为契约上的抽象(接口) 一个更像大自然中的繁衍关系(抽象类)。

直接上代码:

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什么的混淆不清了的更多相关文章

  1. 面试题之——抽象类(abstract class)与接口(interface)的区别

    抽象类可以有构造方法,接口中不能有构造方法.(虽然抽象类有构造方法,但它也不能被实例化) 抽象类中可以有普通成员变量,接口中没有普通成员变量. 抽象类和接口中都可以包含静态成员变量.抽象类中的静态成员 ...

  2. 抽象类(abstract class)和 接口(interface)

    PHP中的 抽象类(abstract class)和 接口(interface) 一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方 ...

  3. 面向对象_06【抽象类:abstract、接口:interface、实现:implements】

    抽象类:abstract抽象:没有足够的描述功能,事物不具体的描述,却又有共性. 特点: 1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中,该类也 ...

  4. 抽象类(abstract class)和接口(Interface)的区别

    前言 抽象类(abstract class)和接口(Interface)是Java语言中对于抽象类定义进行支持的两种机制,赋予了Java强大的面向对象能力. 二者具有很大的相似性,甚至可以相互替换,因 ...

  5. 抽象类(abstract)与接口(interface)的区别

    如果一个类中包含抽象方法,那么这个类就是抽象类.abstract只能用来修饰类或者方法,不能用来修饰属性. 接口是指一个方法的集合,接口中的所有方法都没有方法体.接口通过关键字interface实现. ...

  6. 接口(interface)与抽象类(abstract class)两者的异同

    首先说明一下,JDK1.8以后接口可以有默认方法和静态方法以及私有方法. 一.概念: 接口(interface):是抽象类的变体,其中所有的方法都是抽象的且不能有方法体,而且只能定义 static f ...

  7. 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait

    [源码下载] 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait 作者:webabcd 介绍速战速决 之 PHP 类基础 抽象类 接口 trait 示例1.类的相关知识点 1(基础 ...

  8. Java抽象类接口、内部类题库

    一.    选择题 1. Person类和Test类的代码如下所示,则代码中的错误语句是(  C  ).(选择一项)   public class Person { public String nam ...

  9. 《day09---继承-抽象类-接口》

    //面向对象_继承_概述---单继承_多继承. //描述学生. /* class Student { //属性. String name; int age; //行为: void study() { ...

随机推荐

  1. win8 下 intellij idea 13 中文输入覆盖的问题

    网上的解决方案好啰嗦,精简下如下: 设置环境变量 64位:IDEA_JDK_64 32位:IDEA_JDK 设置的value必须是JDK1.6(IDEA自带1.7版本有问题),和平时设置的JAVA_H ...

  2. position:absolute元素 怎样居中

    <div style = 'height:20px;position:absolute;z-index:9999;top:0;left:0;right:0;margin:auto;'> & ...

  3. 用node.js写一个简单爬虫,并将数据导出为 excel 文件

    引子 最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比.在一阵瞎搞后,我来分享一下初步学习node的三个过程: 1 撸一遍NODE入门,对其有个基本的了解: 2 撸一遍 ...

  4. badboy录制网站出现css样式混乱,网页的图标点击没反应

    本人在测试web工作过程中,遇到了标题一样的问题.苦恼很久也没有找到原因.后面自己摸索,发现了问题所在! badboy安装是2.2.5版本:ie最新版本: 原因:首次安装badboy的时候,所默认的浏 ...

  5. sqlmap命令详解

    cookie注入:sqlmap.py -u 注入点 --cookie "参数" --tables --level 2 POST登录框注入:sqlmap.py -r 从文件读取数据 ...

  6. 【转】MySQL下载安装验证

    MySQL官网下载路径:https://dev.mysql.com/downloads/mysql/ MySQL安装步骤:转自博主 Smile_Coding 博文:https://www.cnblog ...

  7. ASP.NET 下使用特定身份完成windows服务的功能操作

    今天部署项目的发现一个问题: 在本地Win7系统下利用Web页面完成Windows服务的功能操作(启动.停止.安装.卸载)都是正常的,而部署到Server2008系统下,再使用Web页面完成windo ...

  8. 原生JavaScript的DOM操作方法总结

    什么是DOM? DOM即文档对象模型,Document Object Model.  是HTML和XML文档的编程接口.它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从 ...

  9. sublime text3 --前端工程师必备

    sublime text3 --前端工程师必备神器 导读目录: 下载与Emmet插件安装 sublime text3 中cssrem安装与使用 sublime Text 3的中文文件名显示为方框的问题 ...

  10. 【java排序】冒泡排序、快速排序

    冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地 进行直到没有再需要交换,也就是说该数列已经排序完成.这 ...