c#中的interface、abstract與virtual

 

 

  interface用來聲明接口
  1.只提供一些方法規約,不提供方法主體
  如:
  public interface IPerson 
  

       
void getName(); //不包含方法主體 
  }
 

  2.方法不能用public abstract等修飾,無字段變量,無構造函數。

  3.方法可包含參數
  如:
  public interface IPerson 
  

       
void getAge(string s); 
  }
 

  如下,舉一個例子(例1):
  public interface IPerson 
  

       IPerson(); 
//錯誤 
       string name; //錯誤 
       public void getIDcard();//錯誤 
       void getName(); //right 
       void getAge(string s); //right 
  }
 


  實現interface的類
  1.與繼承類的格式一致,如 public class Chinese:IPerson{}
  2.必須實現interface中的各個方法
  例2,繼承例1

   public class Chinese:IPerson 
  

       
public Chinese(){} //添加構造 
       public void getName(){} //實現getName() 
       public void getAge(string s){} //實現getAge() 
  }
 

  abstract聲明抽象類、抽象方法
  1.抽象方法所在類必須爲抽象類
  2.抽象類不能直接實例化,必須由其派生類實現。
  3.抽象方法不包含方法主體,必須由派生類以override方式實現此方法,這點跟interface中的方法類似
  如:

  public abstract class Book 
  

       
public Book() 
       

       }
 

       
public abstract void getPrice(); //抽象方法,不含主體 
   
       
public virtual void getName() //虛方法,可覆蓋 
       
            Console.WriteLine(
"this is a test:virtual getName()"); 
       }
 
   
       
public virtual void getContent() //虛方法,可覆蓋 
       
            Console.WriteLine(
"this is a test:virtual getContent()"); 
       }
 
   
       
public void getDate() //一般方法,若在派生類中重寫,須使用new關鍵字 
       
            Console.WriteLine(
"this is a test: void getDate()"); 
       }
 
  }
 

  
public class JavaBook:Book 
  

       
public override void getPrice() //實現抽象方法,必須實現 
       
            Console.WriteLine(
"this is a test:JavaBook override abstract getPrice()"); 
       }
 

       
public override void getName() //覆蓋原方法,不是必須的 
       
            Console.WriteLine(
"this is a test:JavaBook override virtual getName()"); 
       }
 
  }
 

  測試如下:

  public class test 
  

       
public test() 
       

            JavaBook jbook
=new JavaBook(); 
            jbook.getPrice(); 
//將調用JavaBook中getPrice() 
            jbook.getName(); //將調用JavaBook中getName() 
            jbook.getContent(); //將調用Book中getContent() 
            jbook.getDate(); //將調用Book中getDate() 
       }
 

       
public static void Main() 
       

            test t
=new test(); 
       }
 
  }
 

   virtual標記方法爲虛方法
  1.可在派生類中以override覆蓋此方法
  2.不覆蓋也可由對象調用
  3.無此標記的方法(也無其他標記),重寫時需用new隱藏原方法
  abstract與virtual: 方法重寫時都使用 override 關鍵字
  interface中的方法和abstract方法都要求實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章