`
lovnet
  • 浏览: 6702277 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

接口,抽象类,虚方法,重写(interface,abstract class,virtual function,override)

 
阅读更多

1.抽象类和虚方法的区别(abstract,virtual function)

看到抽象和虚这两词真的觉得有点抽象,有点犯迷糊.其实这两者还是很容易区分的.

1.abstract可以修饰class和class中的成员.而且必须是class被abstract修饰了,里面的成员才能被abstract修饰.而virtual不能用来修饰class.只能用来修饰其中的成员.virtual可用于一般的class中,也可用于被abstract修饰的抽象类中.

2.抽象类不能被实例化.例如定义一个抽象类abstract class Dosomething() { };你这样去用肯定不行:Dosomething do = new Dosomething();

抽象类必须被继承并重写了其中的抽象方法才能被实例化.抽象方法里面是啥都没有的.只有个方法的定义在那,不能在里面去实现任何功能,然后必须在继承的子类中重写了才能用.而virtual方法不能只是个定义必须要实现.在继承的子类中可以被重写然后再用,也可以不重写直接用,用法和一般方法一样

2.为啥要搞个搞抽象类,抽象方法和虚方法出来呢?

虚方法和抽象方法可以用来实现多态,抽象类是实现和接口类似的功能.

一.首先说下多态吧.

我们知道面向对象的最主要的三个特性就是封装,继承,多态.多态简单的说就是通过继承创建的多个class,调用相同的方法(即返回类型,方法名,参数列表都相同.)实现了不同的功能.它是通过在继承中重写(override)相同的方法实现的.

另外有个词叫重载,那是指只参数名字相同.参数列表必须不同.

举个多态的简单例子吧:

//基类:

public class Person

{

public virtualvoid Do()

{

Console.WriteLine("Do something");

}

}

//继承的类:

public class Cheater:Person

{

public override void Do()

{

Console.WriteLine("Go to take money from some fools");

}

}

public class Killer:Person

{

public override void Do()

{

Console.WriteLine("Go to kill somebody");

}

}

Class PersonDo--测试类
{
Static void
Main(string[] args)

{

Person cheater = new Cheater();

cheater.Do();

Person killer = new Killer();

killer.Do();

}
}

--结果为:Go to take money from some fools

-- Go to kill somebody


我们也可以把基类改成抽象类,继承子类不变.运行结果跟上面一样.

public abstract class Person

{

public abstract void Do();

}

二.抽象类和接口的区别:

接口与抽象类有些相同的地方:

1.不能实例化 2.具有没有实现的方法.3.只有被继承的子类实现了没实现的方法才能实例化

不同点:

1.抽象类也是一种特殊的类.所有也只能单继承.接口则可以多继承

2.接口中的方法不能被public,private等修饰符修饰.它默认是为public.

3.接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员

4.接口中的方法都不能实现.而抽象类可以实现一部分方法或者全部实现.就跟一般的class一样.

抽象类体现的是类的概念,是某一类事物的抽象,有该类事物的属性,及各种方法.而接口主要是某一组共同操作的集合.比如动物都有sleep,eat的方法.则可以定义一个接口,有sleep,eat两个方法.鸟类具有属性,两只脚,有羽毛.有方法飞行,下蛋.则可以定义一个抽象类.

其实只是为了设计的方便,清晰易懂而去做这样的考虑.你如果要把接口和抽象类不做区别的混淆使用,也完全是可以的.只要注意那些细微的语法区别.

分享到:
评论

相关推荐

    override abstract virtual interface比较

    override abstract virtual interface比较

    new、abstract、virtual、override,sealed关键字区别和使用代码示例

    new、abstract、virtual、override,sealed关键字区别和使用代码示例

    静态(static)方法重写(override)

    静态(static)方法重写(override)

    c#中的interface abstract与virtual介绍

    abstract 与virtual : 方法重写时都使用 override 关键字,interface中的方法和abstract方法都要求实现

    C#抽象类与抽象方法

    但是一个抽象类里不写抽象方法就没有意义了,既然如此,还不如直接写个普通类? 在一个抽象类里可以不声明抽象方法,这在语法上是没问题的,但实际来说,这样是没有任何意义的。也就是说,你为什么会选择写一个抽象...

    C#中的虚方法和抽象方法的运用

    虚方法可以在子类中通过override关键字来重写 常见的虚方法:ToString() Equals 抽象方法: 抽象类与抽象方法由abstract修饰 abstract的使用注意 –抽象方法没有方法体 –抽象成员只能存在于抽象类中 –抽象类...

    虚方法和重写.pdf

    在子类需要重写override,这样调用的子类的方法 在父类是virtual方法;在子类没有重写override,这样调用的子类的方法 public override void show() { //base.show(); Console.WriteLine("我是老师~~我的姓名...

    ImportDemo.7z

    abstract 抽象 1.覆盖父类,让子类重新定义。 2.抽象方法 子类必须实现 3.抽象类 不能被实例化,只能被继承。... 接口不可以使用修饰符 abstract virtual override static 接口不能定义字段和不能定义方法体。

    基于多态之虚方法、抽象类、接口详解

    1、在父类方法的返回值前加 virtual 关键字,标记为虚方法,表示这个方法可以被子类重写。 2、虚方法必须有方法体,方法体中可以没有任何内容。 3、子类可以根据需求选择性的是否重写虚方法。如果需要重写,在子类...

    Java重写(Override)&重载(Overload).pdf

    Java面向对象编程中的重写(override)指的是子类可以重写其父类中的非private方法,使得子类在调用该方法时会使用自己的实现而不是父类的实现。 重写(Override)讲解 定义一个名为 Animal 的父类和一个名为 Cat 的...

    详解C#用new和override来实现抽象类的重写区别

    本篇文章主要介绍了详解C#用new和override来实现抽象类的重写区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。

    虚方法的解释

    虚方法实际上介绍virtual 修饰符,我们称之为虚方法,反之为非虚。使用了virtual 修饰符后,不允许再有static, abstract, 或override 修饰符。

    抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 引入: 在前面介绍的两个创建型模式里面,我们解决的都是有关"new"的问题,用它们来避免显式指定类创建对象。我写的也非常简单易懂,相信看过的朋友们都应该对简单工厂...

    asp.net中virtual和abstract的区别分析

    情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。 当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName ...

    as3 接口类的用法和好处

    真正的抽象类跟接口一样,不 能实例化,而且,继承者必须覆盖抽象类的所有方法才可以实例化(所以这点跟接口也很相似)。AS3有内置的抽象类如 DisplayObjectContainer,大家可以尝试去用来测试实例化,继承的可行性...

    C#重写重载与多态

    重写:是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override。重载:用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。多态:c#的多态性...

    asp.net 虚方法、抽象方法、接口疑问

    一、抽象类中可以提供非抽象的执行方法吗?接口呢? 答:抽象类可以这么写: 代码如下:public abstract class A { public string getWebUrl() { return “jb51.net”; } public abstract string getWebName(); } ...

    深入理解C# abstract和virtual关键字

    } } class B : A // 注意B是从A类继承,所以A是父类,B是子类 { public override void Func() // 注意override ,表明重新实现了虚函数 { Console.WriteLine(“Func In B”); } } class C : B // 注意C是从B类继承,...

    C#中方法的重写

    本文为您介绍C#中方法的重写的文章,具体方法请看介绍  问题一:什么是重写?  “重写”父类方法是修改它的实现方式或者说在...要重写父类的方法,前提是父类中该要被重写的方法必须声明为virtual或者是abstract

Global site tag (gtag.js) - Google Analytics