在一个类前加“abstract”关键字,此类就成为抽象类。

对应的,在一个方法前加“abstract”关键字,此方法就成为抽象方法。

abstract class Fruit    //抽象类
{
public abstract void GrowInArea();//抽象方法
}

  注意抽象方法不能又实现代码,在方法名后直接跟一个分号。

  抽象类专用于派生出子类,子类必须实现抽象类中所生命的方法。否子子类仍是抽象类。

  抽象类一般用于表达一种比较抽象的事物,比如说“水果”,而抽象方法则说明此抽象类应该具有的某种特性。比如Fruit类中有一个抽象方法GrowInArea(),说明水果一定有一个最适合其生长的地区,但不同的水果生长是不同的。

  从统一抽象类中继承的子类拥有相同的方法(及抽象类所定义的抽象方法),但这种方法的具体代码每个类都可以不一样。

  如:

  

class Apple:Fruit    //苹果类
{
public override void GrowInArea()
{
Console.WriteLine("南北方都可以种植。");
}
}
class Pineapple:Fruit //菠萝
{
public override void GrowInArea()
{
Console.WriteLine("只在南方种植。");
}
}

上述代码中的override关键字,说明子类重写了基类的抽象方法,抽象类不能创建对象,一般用它来引用子类对象。

Fruit f;
f=new Apple();
f.GrowInArea();
f=new Pineapple();
f.GrowInArea();

结果:

南北方都可以种植。
只在南方种植。

上述几段代码所说,f 所引用的对象不同而输出不同的结果。

可以按照以下公式编写代码:

抽象类 抽象类变量名=new 继承自此抽象类的具体子类名();

一个抽象类中可以包含非抽象的方法和字段。因此:

包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法。

抽象属性

abstract class Parent
{
public abstract String Message //抽象属性
{
get;set;
}
} class Child:Parent
{
private String _msg;
public override String Message
{
get
{
return _msg;
}
set
{
_msg=value;
}
}
}

代码使用:

Parent p =new Child();
p.Message="Hello";

接口

举个例子

鸭子是一种鸟,会游泳,同时又是一种食物。

如何在面向对象的程序中表达这种关系?

因为在C#中无法继承两个类,所以为了解决这一问题,C#引入了接口(interface),并规定”一个类可以实现多个接口“。

关键在interface用于定义接口

//定义两个接口
public interface ISwim
{
void Swim();
} public interface IFood
{
void Cook;
}

接口可以看成一种”纯“的抽象类,接口的所有方法都是抽象方法。

//定义一个抽象类
public abstract class Bird
{
public abstract void Fly();
} //继承自一个抽象类,实现两个接口
public class Duck:Bird,IFood,ISwim
{
//实现ISwim接口
public void Swim()
{
Console.WriteLine("是鸭子就会游泳。");
} //实现IFood接口
public void Cook()
{
Console.WriteLine("鸭子经常被烧烤。");
} //实现抽象类Brid中的抽象方法
public override void Fly()
{
Console.WriteLine("只有野鸭才会飞");
}
}

使用:

接口类型名 变量名=new 实现了接口的类型名();

代码:

static void Main(string[] args)
{
Duck d =new Duck();
//Duck对象d可以使用3中方法: //1.自行定义的; //2.父类定义的 //3.接口定义的 d.Fly(); d.Cook(); d.Swim(); //将子类(Duck)对象赋给基类变量 Bird b=d; //现在只能使用基类定义的Fly()方法 b.Fly(); //将Duck对象赋给ISwim接口变量 ISwim s=d; //现在只能使用接口定义的Swim()方法 s.Swim(); //将Duck对象赋给另一个实现的接口IFood接口变量 IFood f=d; //现在只能使用接口定义的Cook()方法 f.Cook(); }

虽然程序中使用都只有一个Duck对象,但将其赋值给不同类型的变量后,其可以使用的方法是不一样的。

显示实现接口

当某个类实现多个接口,创建一个此类的对象之后,通过引用这个对象的对象变量可以访问其所有的公有方法(包括自身的公有方法以及有接口定义的公有方法)。这种情况下,就分不清哪些方法是由接口提供,那些是有自己定义的。而C#提供饿了一种”显示接口“实现机制,区分这两种情况。

interface IMyInterface
{
void func();
} public class A:IMyInterface
{
void IMyInterface.func()
{
//...
} public void func2()
{
//...
}
}

用粗体表示的就是C#对接口IMyInterface的显示实现方式。

当类A显示实现接口IMyInterface后,只能以下面方式访问接口定义的方法:

IMyInterface a=new A();
a.func();

所以说:被显示实现的接口方法只能通过接口实例访问,而不能通过类实例直接访问。

C#编程语言与面向对象——抽象基类与接口的更多相关文章

  1. 6、面向对象以及winform的简单运用(抽象基类与接口)

    抽象类与抽象方法 1.书写规范: 在类前面加上abstract关键字,就成为了抽象类:在一个方法前面加上abstract关键字,就成为了抽象方法(抽象方法不能有实现方法,直接在后面加分号) 例: ab ...

  2. C# 面向对象 , 抽象基类

    抽象基类 关键字,  abstract abstract class SSS { public void aaa() { } } 作为抽象基类, 只能在 继承关系 中 担任父类的角色,不能出现在其他地 ...

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

    结构上的区别: 普通类:数据+方法+实现 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现 接口类:方法(纯虚方法) http://www.cnblogs.com/Tris-wu/p ...

  4. Fluent_Python_Part4面向对象,11-iface-abc,协议(接口),抽象基类

    第四部分第11章,接口:从协议到抽象基类(重点讲抽象基类) 接口就是实现特定角色的方法集合. 严格来说,协议是非正式的接口(只由文档约束),正式接口会施加限制(抽象基类对接口一致性的强制). 在Pyt ...

  5. NSObject class和NSObject protocol的关系(抽象基类与协议)

    [转载请注明出处] 1.接口的实现 对于接口这一概念的支持,不同语言的实现形式不同.Java中,由于不支持多重继承,因此提供了一个Interface关键词.而在C++中,通常是通过定义抽象基类的方式来 ...

  6. 【Python】【元编程】【从协议到抽象基类】

    """class Vector2d: typecode = 'd' def __init__(self,x,y): self.__x = float(x) self.__ ...

  7. python(七):元类与抽象基类

    一.实例创建 在创建实例时,调用__new__方法和__init__方法,这两个方法在没有定义时,是自动调用了object来实现的.python3默认创建的类是继承了object. class A(o ...

  8. PythonI/O进阶学习笔记_3.2面向对象编程_python的继承(多继承/super/MRO/抽象基类/mixin模式)

    前言: 本篇相关内容分为3篇多态.继承.封装,这篇为第二篇 继承. 本篇内容围绕 python基础教程这段: 在面向对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法.使 ...

  9. Python抽象基类:ABC谢谢你,因为有你,温暖了四季!

    Python抽象基类:ABC谢谢你,因为有你,温暖了四季! Python抽象基类:ABC谢谢你,因为有你,温暖了四季! 实例方法.类方法和静态方法 抽象类 具名元组 参考资料 最近阅读了<Pyt ...

随机推荐

  1. win7系统 .chm文件打不开的解决办法

    一.正确操作方法1.鼠标右键单击该CHM文件,在右键快捷窗口中选择“打开方式”-“Microsoft HTML Help Executable”:2.如果出现一个提示窗口,大意是说,该CHM文件的发行 ...

  2. Eclipse中怎么安装TestNG单元测试框架

    在进行使用的eclipse的进行开发的代码中,必然就会需要进行单元测试,在单元测试的情况提供较多的框架单元测试,例如使用junit单元测试,而在国外进行开发较好的单元测试,提供了较好的测试的报告,ju ...

  3. Python学习06——列表的操作(2)

    笨办法学Python第39节 之前用的第三版的书,昨天发现内容不对,八块腹肌又给我下了第四版,这次的内容才对上.本节的代码如下: ten_things = "Apples Oranges C ...

  4. C#机器视觉入门系列1-转化为灰度图&&3*3模糊

    这是我入门机器视觉的系列学习经验之开篇,本来想着依靠opencv快速实现一些功能,但是想了一下既然是学数学的,还是应该自己多算算,写一些自己理解的东西才好. 入门篇很简单,就只是实现了转化成灰度图以及 ...

  5. 简单几句话总结Unicode,UTF-8和UTF-16

    概念 先说一说基本的概念,这包括什么是Unicode,什么是UTF-8,什么是UTF-16. Unicode,UTF-8,UTF-16完整的说明请参考Wiki(Unicode,UTF-8,UTF-16 ...

  6. ref与out之间的区别

    ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递.对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别. 总结起来,他们有如下语法区别: 1.ref ...

  7. Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] --11061188刘强

    结对编程总结 队员:刘强(11061188) 林谋武(11061169) 结对编程: 结对编程的优点: 1.  两个人合作,相比于一个人自己奋斗而言,更能激发自己的潜能:我们在合作过程中,互相学习,互 ...

  8. taginput ,complete使用笔记

    页面用到自动完成功能及需要taginput控件去展示,查资料的过程中发现 有两个类似的jQuery类库,到现在我也没搞明白它们两个有啥关联,jquery.tagsinput.js和bootstrap- ...

  9. Android Studio下SlidingMenu的导入与基础使用

    一.关于这个控件,其实我们现在很多app都在用,最简单的,你打开QQ,当看资料卡的时候,首先要侧拉一下,那个就是SlidingMenu 这几天查了很多资料,各种方法都试了,但是一直都没有成功,最后在一 ...

  10. jpa 表字段转bean对象

    select 'private ' || decode(v_type, 'int', 'Integer', 'float', 'Double', 'date', 'Date', 'String') | ...