我理解c#中的interface abstract virtual override和new

來源:互聯網
上載者:User
我理解c#中的interface abstract virtual override和new2008-01-03 14:19

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();//正確

void getAge(string s);//正確

}

實現interface的類

1.與繼承類的格式一致,如 public class Chinese:IPerson{}

2.必須實現interface中的各個方法

例2,繼承例1

public class Chinese:IPerson

{

public Chinese(){}//添加建構函式

public void getName(){}//實現getName()

public void getAge(){}//實現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方法都要求實現

overrid和new

//override不能重寫非虛方法或靜態方法。
//所重寫的基方法必須是虛擬、抽象的或重寫的。
//所以說虛(virtual)成員與重寫(override)成員是配對使用的,
//雖然也可以用new來"隱藏"虛成員

//下面通過例子來看看重寫與隱藏的區別,從而進一步理解虛成員的作用。
//重寫部分----------
public class MyBaseClass
{
  public virtual void DoSomething()
     {
       Console.WriteLine("Base imp");
     }
}

public class MyDerivedClass:MyBaseClass
{
  public override void DoSomething()
     (
       Console.WriteLine("Derived imp");
     }
}

//其中重寫方法將替換基類中的執行代碼,這樣下面的代碼就將使用替換代碼,
//即使這是通過基類進行的,情況也是這樣:

     MyDerivedClass myObj=new MyDerivedClass();
     MyBaseClass myBaseObj;
     myBaseObj=myObj;
     myBaseObj.DoSomething();
  
//結果如下:

     Derived imp
  

//另外,還可以使用下面的程式碼後置基類方法:
public class MyBaseClass
{
public virtual void DoSomething()
     {
       Console.WriteLine("Base imp");
     }
}

public class MyDerivedClass:MyBaseClass
{
  new public void DoSomething()
     {
        Console.WriteLine("Derived imp");
     }
}
//基類方法不必是虛擬,但結果是一樣的,上面的代碼只需要修改行。
//對於基類的虛擬方法和非虛擬方法來說,其結果如下:
       Base imp
//儘管隱藏了基類的執行代碼,但仍可以通過基類訪問它。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.