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

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

直接上代码:

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. 792. Number of Matching Subsequences

    Given string S and a dictionary of words words, find the number of words[i] that is a subsequence of ...

  2. 聊聊jvm系列

    http://blog.csdn.net/column/details/talk-about-jvm.html

  3. 非常好用的@ResponseBody注解

    AJAX的写法: ajax接收json格式: ①如果ajax接收的是text dataType:"text", var json = eval("(" + da ...

  4. python求100以内素数

    python求100以内素数之和 from math import sqrt # 使用isPrime函数 def isPrime(n): if n <= 1: return False for ...

  5. 支付宝小程序自定义弹窗插件|支付宝dialog插件|model插件

    支付宝小程序自定义弹窗组件wcPop|小程序自定义对话框|actionSheet弹窗模板 支付宝小程序官方提供的alert提示框.dialog对话框.model弹窗功能比较有限,有些都不能随意自定义修 ...

  6. SpringBoot入门(IDEA篇)(一)

    一.SpringBoot简介 开发团队:Pivotal团队 主要目的:简化新Spring应用的初始搭建以及开发过程. 秉持理念:约定优于配置.(该框架使用了特定的方式来进行配置,从而使开发人员不再需要 ...

  7. Python运行MapReducer程序时所遇异常

    landen@Master:~/UntarFile/hadoop-1.0.4$ bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar ...

  8. springboot自定义错误页面

    springboot自定义错误页面 1.加入配置: @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { re ...

  9. 【树】Convert Sorted Array to Binary Search Tree

    题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST ...

  10. Types方法之upperBound-lowerBound-isUnbounded-containsType

    1.upperBound(Type t)方法 /** * The "rvalue conversion". * The upper bound of most types is t ...