c#中抽象类,interface,abstract、override、virtual、sealed使用

interface:接口声明不包括数据成员,只能包含方法,属性,事件,索引等成员,使用接口时不能声明抽象成员(不能直接new实例化)

public interface IStringList //接口一般用I作为首字母
{
    //接口声明不包括数据成员,只能包含方法、属性、事件、索引等成员
    //使用接口时不能声明抽象成员(不能直接new实例化)
    void Add ( string s ) ;
    int Count{ get; }
    string this[int index] { get; set; }
}
//public abstract 默认,这两个关键词不写出来
using System;
namespace TestInterface
{
    interface Runner
    {
        void run();
    }
    interface Swimmer
    {
        void swim();
    }
    abstract class Animal  //抽象类用作基类
    {
        abstract public void eat();
    }
    class Person : Animal, Runner, Swimmer
    {
        public void run()
        {
            Console.WriteLine("run");
        }
        public void swim()
        {
            Console.WriteLine("swim");
        }
        public override void eat()
        {
            Console.WriteLine("eat");
        }
        public void speak()
        {
            Console.WriteLine("speak");
        }
    }
    class Program
    {
        static void m1(Runner r)
        {
            r.run();
        }
        static void m2(Swimmer s)
        {
            s.swim();
        }
        static void m3(Animal a)
        {
            a.eat();
        }
        static void m4(Person p)
        {
            p.speak();
        }

        public static void Main(string [] args)
        {
            Person p = new Person();
            m1(p);
            m2(p);
            m3(p);
            m4(p);
            Runner a = new Person();
            a.run();

            Console.ReadKey(true);
        }
    }
}

抽象类:(不一定全是要抽象成员,可以包含普通成员,但是派生类必须实现基类中的抽象成员)

    (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法    (2) 抽象类不能被实例化    (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类    (4) 具体派生类必须覆盖基类的抽象方法    (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们。接口(能直接使用接口里的方法什么):
    (1) 接口不能被实例化    (2) 接口只能包含方法声明    (3) 接口的成员包括方法、属性、索引器、事件    (4) 接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。
    (5) 接口中的所有成员默认为public,因此接口中不能有private修饰符    (6) 派生类必须实现接口的所有成员    (7) 一个类可以直接实现多个接口,接口之间用逗号隔开    (8) 一个接口可以有多个父接口,实现该接口的类必须实现所有父接口中的所有成员。
抽象类和接口的相同点:1.都可以被继承。2.都不能被实例化(不能被new)3.都可以包含方法声明。4,派生类必须实现未实现的方法。抽象类和接口的区别:1.抽象类可以定义字段,属性,方法实现。接口可以实现方法,事件,属性,索引器,但不能定义字段。2.抽象类是一个不完整的类,需要进一步实现(继承,并实现方法)。接口是一个行为规范,可以直接继承引用3,接口可以被多重实现,抽象类只能被单一继承。4.抽象类更多的定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类间5.抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性,接口是为了满足外部调用而定义的一个功能约定,因此反映的事物的外部特性。6.接口基本不具备继承的特性,仅仅能够调用而已。7.接口可以用于支持回调,而继承并不具备这个特点。8.抽象类中实现具体方法默认为虚的,而实现接口的类中的接口方法却默认为非虚,当然也可以声明为虚。9如果抽象类中实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口方法

原文地址:https://www.cnblogs.com/xyyshishuaige/p/9046837.html

时间: 2024-07-31 06:38:06

c#中抽象类,interface,abstract、override、virtual、sealed使用的相关文章

c#中的interface abstract与virtual介绍

abstract 与virtual : 方法重写时都使用 override 关键字,interface中的方法和abstract方法都要求实现 interface用来声明接口1.只提供一些方法规约,不提供方法主体.  如: 复制代码 代码如下: public interface IPerson{    void getName();//不包含方法主体} 2.方法不能用public abstract等修饰,无字段变量,无构造函数.3.方法可包含参数.  如 复制代码 代码如下: public in

C#--virtual,abstract,override,new,sealed

virtual:使用此关键字,可以使其在派生类中被重写. abstract:抽象方法,由子类重写,或继续为抽象方法存在,并由其子子类实现. override: 重写父类方法,属性,或事件的抽象实现或虚方法. new:显式隐藏从父类继承的成员. 后台代码: public abstract class Animal { public abstract void Eat(); public virtual void Sleep() { HttpContext.Current.Response.Writ

C# -abstract, override, virtual, new

new声明的方法,当使用子类的类型来调用的时候,它会运行子类的函数,而如果类型是基类的话,被隐藏的基类函数会被调用. 而子类中函数使用override的时候,则当使用子类的类型来调用的是,它会运行子类的函数,类型是基类的时候,仍会调用子类函数.

c#中抽象类(abstract)和接口(interface)的相同点与区别

相同点: 1.都可以被继承 2.都不能被实例化 3.都可以包含方法声明 4.派生类必须实现未实现的方法 区别: 1.抽象基类可以定义字段.属性.方法实现.接口只能定义属性.索引器.事件.和方法声明,不能包含字段. 2.抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范.微软的自定义接口总是后带able字段,证明其是表述一类“我能做...” 3.接口可以被多重实现,抽象类只能被单一继承 4.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中 5.抽象类

Java中抽象类和接口的区别(abstract class VS interface)

前言:本文解决的问题 什么是抽象类 抽象类的应用场景 接口可以有方法实现吗 接口和抽象类的区别 1 什么是抽象类 在声明时含有关键字abstract就是抽象类,抽象类它可以看作具体类的一个模板,继承它的子类可以从抽象类中共享一些方法(可能是不完整的)和属性. A class which is declared with the abstract keyword is known as an abstract class in Java. It can have abstract and non-

接口和抽象类:Interface、abstract _【转】

一.接口 接口是C#中很常见的工具,概念什么的就不说了,这里讲几个值得注意的小地方: 1.接口内部只能有函数.属性和事件的声明: interface IParent { void Show(); string Type { get; set; } event AddChildren Add; } 在接口中声明的成员都不需要访问修饰符(public,private等),因为接口成员的权限默认都是public,另外值得注意的是接口中之所以能够声明事件是因为事件就是委托的特殊属性. 接口不能是静态的,

不要在对抽象类接口abstract virtual什么的混淆不清了

(最近带一个新手入门 讲这边老费力了.) 接口和抽象类不过都是类的抽象罢了,这是他们的本质,只不过人们的思维角度不同而已,一个偏向为行为契约上的抽象(接口) 一个更像大自然中的繁衍关系(抽象类). 直接上代码: class 抽象类 { public static void Main(string[] args) { ChinesePerson c = new ChinesePerson("xx", 23); c.Run(); c.Speak(); Console.WriteLine(c

C#中Abstract和Virtual[转载]

原文:http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚

C#基础知识(base、this、new、override、abstract、virtual、static)

前言 本文主要来讲解一下C#中,自己觉得掌握的不怎么样或者用的不多,不太熟悉的关键字,主要包括base.this.new.override.abstract.virtual以及针对static字段和static构造函数之间的执行问题. base关键字 base 关键字用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数.实例方法和实例属性访问器中: 调用基类上已被其他方法重写的方法. public class Father { public virtual void Say()

C#中Abstract和Virtual(转)

在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生