c#接口,抽象类学习

说明

接口可以包含方法、属性、索引器、和事件作为成员,但是并不能设置这些成员的具体值。也就是说,只能定义,不能那个给他里面定义的东西赋值。

接口具有以下特性。

  •  接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
  •  不能直接实例化接口。
  •  接口可以包含事件、索引器、方法和属性。
  •  接口不包含方法的实现。
  •  类和结构可从多个接口继承。
  •  接口自身可从多个接口继承。

c#中声明接口时,使用interface关键字

修饰符 interface 接口名称:继承的接口列表
{
    接口内容;
}

说明

1.声明接口时,除interface关键字和接口名称外,其他都是可选项。

2.可以使用new、public、protected、internal和private等修饰符声明接口,但接口成员必须是公共的。

常见的访问修饰符有:

(1)public 公有访问。不受任何限制。

(2)private 私有访问。只限于本类成员访问,子类。

(3)protected 保护访问。只限于本类和子类访问。

(4)internal 内部访问。只限于本项目内访问,其他不能访问。

(5)protected internal 内部保护访问。只限于本项目或是子类访问,其他不能访问

接口的实现与继承

接口定义:

interface Imyinterface//再三强调,接口中只能声明,不能给定义赋值
    {
        string ID
        {
            get;
            set;
        }
        string Name
        {
            get;
            set;
        }
        void ShowInfo();//不能给函数写任何内容
    }
    
class program:Imyinterface//program类继承接口,需要对接口里的内容全部进行定义,否则编译就会不通过
     {
        private string id = "";
        private string name = "";
        public string ID
        {
            get { return id; }
            set { id = value; }
        }
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public void ShowInfo()
        {
            Console.WriteLine("编号\t 姓名");
            Console.WriteLine(ID+"\t"+Name);
        }
    }

主函数:

static void Main(string[] args)
        {
            program p = new program();//这里是实例化program类对象
            p.ID = "TM";
            p.Name = "C#3.5从入门到应用开发";
            p.ShowInfo();
            Imyinterface mf = p;//使用派生类对象实例化接口Imyinterface
            mf.ID = "MCK";//为派生类中的ID属性赋值
            mf.Name = "2018";//为派生类中的Name属性赋值
            mf.ShowInfo();//调用派生类中的函数
        }

运行结果:

编号     姓名
TM       C#3.5从入门到应用开发
MCK      2018

上面的实例中只继承了一个接口,接口还可以多重继承,使用多重继承时,要继承的接口间用逗号(,)分隔。

  • 例:我声明了3个接口IPeople、ITeacher、IStudent,其中ITeacher、IStudent继承自IPeople。然后使用Program类继承这三个接口。

接口声明:

interface IPeople
    {
        string Name
        { get; set; }
        string Sex
        { get; set; }
    }
interface IStudent:IPeople
    {
        void study();
    }
interface ITeacher:IPeople
    {
        void teach();
    }
class program:IPeople,IStudent,ITeacher
     {
        private string name = "";
        private string sex = "";
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public string Sex
        {
            get { return sex; }
            set { sex = value; }
        }
        public void teach()
        {
            Console.WriteLine(Name+" "+Sex+" 老师");
        }
        public void study()
        {
            Console.WriteLine(Name+" "+Sex+" 学生");
        }
    }

主函数:

 static void Main(string[] args)
        {
            program pg = new program();
            ITeacher it = pg;
            it.Name = "mck";
            it.Sex = "man";
            it.teach();
            IStudent ist= pg;
            ist.Name = "mck";
            ist.Sex = "man";
            ist.study();
        }

运行结果:

mck man 老师 
mck man 学生 

显式接口成员实现

显式接口成员实现是使用接口名称和一个句点命名该类成员实现的。

interface IPeople
    {
        string Name
        { get; set; }
        string Sex
        { get; set; }
    }
    interface IStudent:IPeople
    {
        void study();
    }

    interface ITeacher:IPeople
    {
        void teach();
        void study();
    }
    
    class program:IPeople,IStudent,ITeacher
     {
        private string name = "";
        private string sex = "";
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public string Sex
        {
            get { return sex; }
            set { sex = value; }
        }
        public void teach()
        {
            Console.WriteLine(Name+" "+Sex+" 老师");
        }
        void  IStudent.study()//显式接口方法,只能是ISudentd的对象使用
        {
            Console.WriteLine(Name+" "+Sex+" 学生学习");
        }
        void ITeacher.study()//显式接口方法,只能是ITeacher的对象使用
        {
            Console.WriteLine(Name + " " + Sex + " 老师学习");
        }
    }
static void Main(string[] args)
        {
            program pg = new program();//实例化接口继承类的对象
            ITeacher it = pg;//使用接口继承类的对象实例化接口
            it.Name = "mck";
            it.Sex = "man";
            it.teach();
            it.study();
            IStudent ist= pg;//使用接口继承类的对象实例化接口
            ist.Name = "mck";
            ist.Sex = "man";
            ist.study();
            
        }

注意

1.显式接口成员实现中不能包含访问修饰符、abstract、virtual、override或static修饰符。

2.显式接口成员属于接口的成员,而不是类的成员,因此,不能使用类的对象直接访问,只能通过接口对象访问。

抽象类和抽象方法

如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类。在抽象类中声明方法时,如果加上abstract关键字,则为抽象方法。

抽象类的概述及声明

抽象类和非抽象类的区别:

  •  抽象类不能直接实例化。
  •  抽象类中可以包含抽象成员,但非抽象类中不可以。
  •  抽象类不能被密封。
访问修饰符 abstract class myclass
{
    public int i;
    public void method()
    {}
}

抽象方法概述及声明

抽象方法就是在声明方法时,加上abstract关键字,声明抽象方法时需要注意:

  •  抽象方法必须声明在抽象类中。
  •  声明抽象方法时,不能使用virtual、static和private修饰符。

抽象方法不提供任何实际实现,因此抽象方法的方法体只包含一个分号;

当从抽象类派生一个非抽象类时,需要在非抽象类中重写抽象的方法,以提供具体实现,重写抽象方法时使用override关键字。

例:声明一个抽象类,里面有一个抽象方法

public abstract class myclass
{
    public abstract void method();//抽象方法
}
发布了24 篇原创文章 · 获赞 48 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xiaokai1999/article/details/87900628