抽像类与接口

接口和抽像类都不能被实例化。只允许通过继承来使用

接口和抽像类比较

  接口 抽像类
属性 支持 支持
实体方法 NO 支持
抽像方法 NO   支持
虚方法 NO 支持
字段 NO 支持
事件 支持 支持
索引器 NO 支持

实现接口的抽象类可以将接口方法映射到抽象方法上。 例如:

interface I
{
    void M();
}
abstract class C : I
{
    public abstract void M();
}

接口可以多继承,抽像类只能单继承

接口内部,属性、接口方法、都不允许有修饰符。默认是PUBLIC

抽像类:

    abstract class MyAbstract
    {

        private string[] name = new string[2];

        //索引器必须以this关键字定义,其实这个this就是类实例化之后的对象
        public string this[int index]
        {
            //实现索引器的get方法
            get
            {
                if (index < 2)
                {
                    return name[index];
                }
                return null;
            }

            //实现索引器的set方法
            set
            {
                if (index < 2)
                {
                    name[index] = value;
                }
            }
        }

        /// <summary>
        /// 事件
        /// </summary>
        event Action<string> ClickEvent;

        /// <summary>
        /// 字段
        /// </summary>
        string Address = "";

        /// <summary>
        /// 属性
        /// </summary>
        public int Age { get; set; }

        /// <summary>
        /// 方法
        /// </summary>
        /// <returns></returns>
        public string GetName()
        {
            return "my Name";
        }
        /// <summary>
        /// 抽像方法
        /// </summary>
        /// <returns></returns>
        public abstract string GetName2();
        /// <summary>
        /// 虚方法
        /// </summary>
        /// <returns></returns>
        public virtual string GetName3()
        {
            return "22";
        }
    }

接口:

   public interface MyInterface
    {

        /// <summary>
        /// 事件
        /// </summary>
        event Action<string> ClickEvent;

        /// <summary>
        /// 属性
        /// </summary>
        int Age { get; set; }

        /// <summary>
        /// 方法
        /// </summary>
        /// <returns></returns>
        string GetName();

    }

组合类:

使用:

            Person p = new Person();
            p.Age = 20;
            p.Name = "王某某";

类代码:

    /// <summary>
    /// 组合类
    /// </summary>
    public partial class Person
    {
        public int Age { get; set; }
    }

    /// <summary>
    /// 组合类
    /// </summary>
    public partial class Person
    {
        public string Name { get; set; }
    }

组合类的名字相同,用 partial 来修饰

WEB页面中。广泛使用 partial

抽像类的实现:

 public class AbstractExample : MyAbstract
    {
        int age = 0;

        /// <summary>
        /// 重写虚方法
        /// </summary>
        public override int Age2
        {
            get
            {
                return age;
            }

            set
            {
                age = value;
            }
        }

        /// <summary>
        /// 覆盖父类 void Name(string name) 方法
        /// </summary>
        /// <param name="name"></param>
        public new void Name1(string name)
        {
            Console.WriteLine("my Name1 is {0},普通方法", name);
        }

        /// <summary>
        /// 重写抽像方法 abstract void Name2(string name);
        /// </summary>
        /// <param name="name"></param>
        public override void Name2(string name)
        {
            Console.WriteLine("my Name2 is {0},抽像方法", name);
        }

        /// <summary>
        /// 重写虚方法 virtual void Name3(string name)
        /// </summary>
        /// <param name="name"></param>
        public override void Name3(string name)
        {
            base.Name3(name);
            Console.WriteLine("child,my Name3 is {0},虚方法", name);
        }
    }

抽像类的使用:

            ///使用抽像类来定义
            MyAbstract abstractexample = new AbstractExample();

            Console.WriteLine("abstractexample.Age={0}", abstractexample.Age);
            Console.WriteLine("abstractexample.Age2={0}", abstractexample.Age2);
            abstractexample.Name1("张某某");
            abstractexample.Name2("赵某某");
            abstractexample.Name3("李某某");

            Console.WriteLine("------------------------------------");

            ///使用派生类来定义
            AbstractExample abstractexample2 = new AbstractExample();
            abstractexample2.Name1("张某某");
            abstractexample2.Name2("赵某某");
            abstractexample2.Name3("李某某");

结果图:

注意图中的两个划线,如果用抽像类来定义、那么用 new 重写的方法将不生效。仍然执行父类方法。

如果用 派生类来定义。new 重写将生效。

接口实现类:

 public class InterfaceExample : MyInterface
    {
        int age = 0;
        /// <summary>
        /// 接口实现了属性
        /// </summary>
        public int Age
        {
            get
            {
                return age;
            }

            set
            {
                age = value;
            }
        }
        /// <summary>
        /// 接口实现了事件
        /// </summary>
        public event Action<string> ClickEvent;

        /// <summary>
        /// 接口实现了方法
        /// </summary>
        /// <returns></returns>
        public void GetName(string name)
        {
            Console.WriteLine("my name is {0}", name);
        }
    }

接口实现类的使用:

            MyInterface interfaceexample = new InterfaceExample();
            interfaceexample.Age = 30;
            ///调用了接口中的属性
            Console.WriteLine("abstractexample.Age={0}", interfaceexample.Age);

            ///实现了接口中的事件
            interfaceexample.ClickEvent += (s) => Console.WriteLine(s);
            ///调用了接口中的方法
            interfaceexample.GetName("贺同学");

override 的3个使用场景

1、abstract(抽像方法)

2、virtual(虚方法)

3、自身

时间: 2024-10-21 11:20:41

抽像类与接口的相关文章

php面向对象之抽像类、接口、final、类常量

一.抽像类(abstract)        在我们实际开发过程中,有些类并不需要被实例化,如前面学习到的一些父类,主要是让子类来继承,这样可以提高代码复用性语法结构:  代码如下 复制代码   abstract class 类名{        属性 $name;        方法(){}  //方法也可以为abstract 修饰符 function 方法名(){}    } 例:  代码如下 复制代码 abstract class animal{        public $name; 

抽象基类与接口

5.1抽象类与抽象方法 在一个类前面加上“abstract”关键字,此类就成为了抽象类. 对应地,一个方法类前面加上“abstract”关键字,此方法就成为了抽象方法. 注意抽象方法不能有实现代码,在函数名后直接跟一个分号. 抽象类专用于派生出子类,子类必须实现抽象类所声明的抽象方法,否则,子类仍是抽 象类. 抽象类一般用于表达一种比较抽象的事物,比如前面所说的“水果”,而抽象方法则说 明此抽象类应该具有的某种性质,比如 Fruit类中有一个抽象方法  GrowInArea(),说明水果 一定有

JAVA-抽象类和接口的区别总结

首先.抽象类和接口都很好的提供了一种将实现和接口分离的方法.. 一.抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样的类我们称它为抽象类.比如new Animal(),我们都知道这个是产生一个动物Animal对象,但是这个Animal具体长成什么样子我们并不知道,它没有一个具体动物的概念,所以他就是一个抽象类,需要一个具体的动物,如狗.猫来对它进

数据结构-List接口-LinkedList类-Set接口-HashSet类-Collection总结

一.数据结构:4种--<需补充> 1.堆栈结构:     特点:LIFO(后进先出);栈的入口/出口都在顶端位置;压栈就是存元素/弹栈就是取元素;     代表类:Stack;     其它:main方法最后一个出去; 2.数组结构:     特点:一片连续的空间;有索引,查找快;增删慢;     代表类:ArrayList;     应用场景:用于查询多的场景,如天气预报; 3.队列结构:     特点:FIFO(先进先出);入口/出口在两侧;     代表:Queue接口     应用场景

Java语言程序设计 上机实验4 掌握声明接口、一个类实现接口的声明和使用方法

Java语言程序设计 上机实验4 实验目的: 理解接口的作用,理解接口和实现接口的类的关系,掌握声明接口.一个类实现接口的声明和使用方法:熟悉Java语言包和实用包中的常用类. 实验内容:(*)为选做 声明圆柱体类Cylinder,继承椭圆类Ellipse(实现周长Perimeter接口和面积Area接口),为圆柱体类设计较为全面的构造方法,并实现体积Volume接口,计算表面积和体积. 将Java的若干关键字(15个以上)保存在一个字符串数组中,对其按升序排列,再采用顺序查找和二分法查找,判断

【总结】Effective java经验之谈,类与接口

转载请注明出处:http://blog.csdn.NET/supera_li/article/details/44940563 Effective Java系列 1.Effective java经验之谈,创建和销毁对象 2.Effective java经验之谈,泛型 3.Effective java经验之谈,类与接口 4.Effective java经验之谈,通用方法 5.Effective java经验之谈,枚举,注解,方法,通用设计,异常 6.Effective java经验之谈,并发编程

类,抽象基类,接口类三者间的区别与联系(C++)

联系很明显,三个都是‘类’,如果读者对类的概念不清楚,可以参照wid的博文http://www.cnblogs.com/mr-wid/archive/2013/02/18/2916309.html. 下面着重解释一下区别,但此文仅是个人理解,如果觉得我说的不对的地方,还请赐教. (1)结构上的区别: 普通类:数据+方法+实现 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现 接口类:方法(纯虚方法) (2)概念上的区别: 普通的类和另外两个的区别很明显,普通类就是猫狗之类的,而抽象类

ledisdb:支持类redis接口的嵌入式nosql

前言 java中的反射的底层实现是,在jvm的Classloader获得全限定名来创建Class. 正文 获得反射类型对象 1.类名.class 不执行静态快 2..Class<?> getClass() Returns the runtime class of this Object. 3.static Class<?> forName(String className) Returns the Class object associated with the class or

类与接口的关系

1. 接口与接口之间可以相互继承: 2. 类与类之间可以相互继承: 3. 类与接口之间,只能是类来实现接口: 4. 继承已经具有父类的方法,子类可以不重写父类方法:类在实现接口的时候,必须重写接口所有的方法. 5. Demo interface Valuable { public double getMoney(); } interface Protectable { public void beProtectable(); } interface A extends Protectable {