`
wsql
  • 浏览: 11756461 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例

 
阅读更多

1.抽象类可以有实现(包括构造函数),而接口不可以有任何实现。

namespace ConsoleApplication1
{
class Program
{
interface IMyInterface1
{
void IMethod1();
void IMethod2();
}
abstract class AMyClass1
{
public abstract void AMethod1();
public abstract void AMethod2();
public AMyClass1()
{
}
public void AMethod()
{
Console .WriteLine("AMyClass.Amethod." );
}
}
static void Main(string [] args)
{
}
}
}

在上面我们定义了一个接口和一个抽象类,在抽象类中我们有一个实现方法 AMyClass1 而在接口中这是不允许的。接口中的所有方法都必须是未实现的(包括构造函数也是不能有的)。

2. 抽象类中还以有成员变量(包含静态成员变量)、属性、常量和静态方法,并且他们可以是非公共的;而接口中不能有成员变量、常量、静态方法,只能有公共的属性。

namespace ConsoleApplication1
{
class Program
{
interface IMyInterface1
{
void IMethod1();
void IMethod2();
int IProperty1
{
set ;
get ;
}
}
abstract class AMyClass1
{
public abstract void AMethod1();
public abstract void AMethod2();
public void AMethod3()
{
Console .WriteLine("AMyClass.Amethod." );
}
private static void AMethod4()
{
}
private int i;
private static int j;
private double PI = 3.1514926;
private int aProperty;
int Aproperty
{
get { return aProperty; }
set { aProperty = value ; }
}
}
static void Main(string [] args)
{
}
}
}

正如上面的一段代码一样,在抽象类中可以有属性、常量、成员变量(包含静态成员)、静态方法,而且它们还可以是非公共的;而在接口中除了有未实现的公共方法外,只可以有属性,并且是公共的(默认,不能添加public 修饰符,否则在C# 中报错)。

3.抽象类可以从另一个类或者一个/ 多个接口派生;而接口不能从另一个类派生却可以实现另一个或多个接口。

namespace ConsoleApplication1
{
class Program
{
interface IMyInterface1
{
void IMethod1();
void IMethod2();
int IProperty1
{
set ;
get ;
}
}
interface IMyInterface2
{
void IMethod3();
void IMethod4();
}
abstract class AMyClass1
{
public abstract void AMethod1();
public abstract void AMethod2();
public void AMethod3()
{
Console .WriteLine("AMyClass.Amethod." );
}
private static void AMethod4()
{
}
private int i;
private static int j;
private double PI = 3.1514926;
private int aProperty;
int Aproperty
{
get { return aProperty; }
set { aProperty = value ; }
}
}
abstract class AMyClass2
{
public abstract void AMethod3();
public abstract void AMethod4();
}
abstract class AMyClass3 : AMyClass1
{
public override void AMethod1()
{
}
public override void AMethod2()
{
}
}
abstract class AMyClass4 : AMyClass1 ,IMyInterface1 ,IMyInterface2
{
public override void AMethod1()
{
}
public override void AMethod2()
{
}
public void IMethod1()
{
}
public void IMethod2()
{
}
public int IProperty1
{
get
{
throw new NotImplementedException ();
}
set
{
throw new NotImplementedException ();
}
}
public void IMethod3()
{
}
public void IMethod4()
{
}
}
interface IMyInterface3 : IMyInterface1 , IMyInterface2
{
}
static void Main(string [] args)
{
}
}
}

抽象类可以继承类一个类,而不能继承多个类。但是可以实现多个接口,而且可以在继承一个类的同时实现一个或多个接口;接口则只能实现其他的一个或多个接口,不能继承其他类。

4.一个.net 类只能从一个基类中派生即使这个基类是抽象类;然而一个.net 类可以实现多个接口。(但是如果从一个抽象类派生或者从一个/ 多个接口实现,则必须实现抽象类或接口中所有的方法)

namespace ConsoleApplication1
{
class Program
{
interface IMyInterface1
{
void IMethod1();
void IMethod2();
int IProperty1
{
set ;
get ;
}
}
interface IMyInterface2
{
void IMethod3();
void IMethod4();
}
abstract class AMyClass1
{
public abstract void AMethod1();
public abstract void AMethod2();
public void AMethod3()
{
Console .WriteLine("AMyClass.Amethod." );
}
private static void AMethod4()
{
}
private int i;
private static int j;
private double PI = 3.1514926;
private int aProperty;
int Aproperty
{
get { return aProperty; }
set { aProperty = value ; }
}
}
abstract class AMyClass2
{
public abstract void AMethod3();
public abstract void AMethod4();
}
class Test1 : AMyClass1
{
public override void AMethod1()
{
}
public override void AMethod2()
{
}
}
class Test2 : IMyInterface1 , IMyInterface2
{
public void IMethod1()
{
}
public void IMethod2()
{
}
public int IProperty1
{
get
{
throw new NotImplementedException ();
}
set
{
throw new NotImplementedException ();
}
}
public void IMethod3()
{
}
public void IMethod4()
{
}
}
static void Main(string [] args)
{
}
}
}

从上面的我们可以看出,C# 是不支持多继承的,如果需要多继承我们可以用接口实现(注意在一个类即实现接口又继承其他父类时,接口要在后面)。

分享到:
评论

相关推荐

    C#类、接口、虚方法和抽象方法-抽象类和接口的相同点和区别

    (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,...

    C#接口抽象类区别实例

    c#中抽象类和接口。 相同点: (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 区 别: (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、...

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

    今天在云和学院学了很多,我这次只能先总结一下C#中的虚方法和抽象的运用。 理论: 虚方法: 用virtual修饰的方法叫做虚方法 虚方法可以在子类中通过override关键字来重写 常见的虚方法:ToString() Equals 抽象...

    抽象类_接口_多态_继承整合案例.docx

    抽象类_接口_多态_继承整合案例.。

    细细品味C#(抽象接口委托反射).pdf

     从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。 在方法或属性声明中使用 abstract 修饰符以指示此方法或属性 不包含实现。 【抽象方法】具有以下特性:  抽象方法是隐式的 ...

    C#抽象类和接口的区别分析

    很多C#的初学者在编程时都容易把抽象类和接口搞混,本文就为大家从概念上讲解抽象类和接口的区别: 一、抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是不能被实例化,可以创建一个变量,其...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例116 自定义抽象类计算圆形的面积 141 实例117 利用接口实现选择不同的语言 143 实例118 使用密封类密封用户信息 145 实例119 通过重写虚方法实现加法运算 146 实例120 通过类的多态性确定人类的说话 行为 147 ...

    利用Type动态创建类实例(C#反射)可以演变抽象工厂

    利用Type动态创建类实例(C#反射)可以演变抽象工厂

    C#抽象工厂实例,设计模式

    它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。 l 它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的...

    C#编程几个典型实例

    学习接口和抽象类的实例 学习接口和抽象类的实例 学习接口和抽象类的实例

    C# 抽象接口委托反射等技术详解

    C# 抽象类 接口 委托 反射,通过大量实例与代码来详解各种在C#中难掌握的知识点

    C#抽象工厂模式案例代码

    工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类。也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口。

    C# 抽象类,抽象属性,抽象方法(实例讲解)

    下面小编就为大家分享一篇C# 抽象类,抽象属性,抽象方法的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    C#接口归纳总结实例详解

    C#接口的学习,在编程中,我们经常会用到接口,那什么是接口呢? 接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接口定义中指定的接口成员。 接口使用interface关键字进行定义,...

    C#抽象类与抽象方法详解

    本文实例为大家分享了C#抽象类与抽象方法的具体实现代码,供大家参考,具体内容如下 1.代码 class Program { static void Main(string[] args) { for (int i = 1; i < 10; i++) { if (i % 3 == 1) { ...

    解析在C#中接口和类的异同

    不同点: 不能直接实例化接口。 接口不包含方法的实现。 ...使用目的:若所有子类拥有共同的特性,可以把这个特性放到一个抽象类中,子类继承此抽象类。  特点:  1.不能被实例化;ClassName en=

    c#中抽象类和接口的详细介绍

     二、接口:接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包含未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员...

    C#中抽象方法与虚拟方法的区别

    学过C#的人应该都知道抽象方法与虚拟方法,而很多初学者对二者之间的区别并不是很了解。今天本文就来分析一下二者之间的区别。并附上实例加以说明。具体分析如下: 一、主要区别: 对于抽象方法,子类必须实现它。 ...

Global site tag (gtag.js) - Google Analytics