接口、抽象类、抽象方法、虚方法 的区别

来源:互联网 发布:c4d注册机mac版百度云 编辑:程序博客网 时间:2024/04/29 21:07

                               接口、抽象类、抽象方法、虚方法 的区别


接口、抽象类、抽象方法、虚方法:

 

这四个名词时非常容易混淆的:

 

首先说一下接口 与抽象类 的异同:

相同点:

1.他们都不能实例化自己,也就是说都是用来被继承的。

2.抽象类中的抽象方法和接口方法一样,都不能有方法体

不同点:

1.抽象类里可以有字段,接口中不能有字段.

2.抽象类中的普通方法可以有方法体,而接口方法没有方法体。

3.接口中的方法不能有访问修饰符,抽象类中的抽象方法被继承,需要override重写 .

4.接口更像是一种规范,一种约束。

5.一个子类只能继承一个抽象类,但却可以继承多个接口。

 

接下来是抽象方法 和虚方法 的异同:

其实可以把抽象方法看做是没有方法体的虚方法。

 

相同点:

 

1.抽象方法和虚方法都可以被重写。

 

不同点:

 

1.abstract 和virtual的关键字不同

 

2.抽象方法一定没有方法体,而虚方法可以有方法体。

 

下面写个例子说明一下:

view plaincopy to clipboardprint?
/// <summary>  
/// 一个手机的抽象类  
/// </summary>  
public abstract class Mobilephone   
{  
    private string _logo;  
    public string Logo  
    {  
        get { return _logo; }  
        set { _logo = value; }  
    }  
    public abstract void Call();  
    public virtual void Callagain()   
    {  
        Console.WriteLine("我再打一个电话");  
    }  
}  
 
/// <summary>  
/// 定义一个实体类,继承了一个抽象类及多个接口  
/// </summary>  
public class Nokia :Mobilephone,IClock,Ilistenmusic  
{  
    public override void Call()  
    {  
        Console.WriteLine("NOKIA打电话没问题");  
    }  
    public void clock()  
    {  
        Console.WriteLine("NOKIA的手机也有闹钟功能");  
    }  
    public void listenmusic()  
    {  
        Console.WriteLine("NOKIA的手机还能听歌");  
    }  
    public override void Callagain()   
    {  
        Console.WriteLine("算了,还是不打了");  
    }  
}  
/// <summary>  
/// 下面定义了两个接口,为了说明可以继承多个接口  
/// </summary>  
public interface Ilistenmusic   
{  
    void listenmusic();  
}  
public interface IClock   
{  
    void clock();  

 

 

再补充一个小例子,

这里有到很有意思的面试题,说名了new关键字和override的区别:

 

view plaincopy to clipboardprint?
class Program  
    {  
        static void Main(string[] args)  
        {  
            B5 b5 = new B5();  
            b5.MethodB();  
        }  
    }  
    public class A5  
    {  
        public virtual void MethodA()  
        {  
            Console.WriteLine("A5.MethodA");  
            Console.Read();  
        }  
        public virtual void MethodB()  
        {  
            MethodA();  
        }  
    }  
    public class B5 :A5  
    {  
        public new void MethodA()   
        {  
            Console.WriteLine("B5.MethodA");  
            Console.ReadLine();  
        }  
    } 

 

最后的答案是:"A5.MethodA"

 

示例说明:

 

new是覆盖override是重载。  
   
  “覆盖”并不意味着“删除”  
   
  示例  
  using   System;  
  class   A  
  {  
        public   void   F()    
        {  
              Console.WriteLine("A.F");    
        }  
  }  
  class   B:   A  
  {  
        new   public   void   F()    
        {    
              Console.WriteLine("B.F");    
        }  
  }  
  class   Test  
  {  
        static   void   Main()    
        {  
              B   b   =   new   B();  
              b.F();  
              A   a   =   b;    
              a.F();  
        }  
  }  
  输出为  
  B.F  
  A.F  
   
  但“重载”意味着“删除”,这就是“覆盖”和“重载”的区别。  
   
  示例  
  using   System;  
  class   A  
  {  
        public   virtual   void   F()    
        {  
              Console.WriteLine("A.F");    
        }  
  }  
  class   B:   A  
  {  
        public   override   void   F()    
        {    
              Console.WriteLine("B.F");    
        }  
  }  
  class   Test  
  {  
        static   void   Main()    
        {  
              B   b   =   new   B();  
              b.F();  
              A   a   =   b;    
              a.F();  
        }  
  }  
  输出为  
  B.F  
  B.F