C#中Abstract 、Virtual和Override的使用

來源:互聯網
上載者:User

1. abstract 修飾符指示所修飾的內容缺少實現或未完全實現。 abstract 修飾符可用於類、方法、屬性、索引器和事件。在類聲明中使用abstract修飾符以指示某個類只能是其他類的基類。標記為抽象或包含在抽象類別中的成員必須通過從抽象類別派生的類來實現。

(1)抽象類別具有以下特性:

1) 抽象類別不能執行個體化。

2) 抽象類別可以包含抽象方法和抽象訪問器。

3) 不能用 sealed 修飾符修飾抽象類別,因為這兩個修飾符的含義是相反的。採用 sealed 修飾符的類無法繼承,而 abstract 修飾符要求對類進行繼承。

4) 從抽象類別派生的非抽象類別必須包括繼承的所有抽象方法和抽象訪問器的實際實現。

5) 在方法或屬性聲明中使用 abstract 修飾符以指示方法或屬性不包含實現。

(2)抽象方法具有以下特性:

1) 抽象方法是隱式的虛方法。

2) 只允許在抽象類別中使用抽象方法聲明。

3) 因為抽象方法聲明不提供實際的實現,所以沒有方法體;方法聲明只是以一個分號結束,並且在簽名後沒有大括弧 ({ })。

(3)在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。除了在聲明和調用文法上不同外,抽象屬性的行為與抽象方法一樣。在靜態屬性上使用abstract修飾符是錯誤的。在衍生類別中,通過包括使用 override 修飾符的屬性聲明,可以重寫抽象的繼承屬性。

public abstract class parent

{

protected int x=100;

protected int y = 200;

public abstract void function();

public abstract int X { get; }

public abstract int Y { get; }

}

public class newperson : parent

{

public override void function()

{

x++;

y++;

}

public override int X

{

get { return x+100; }

}

public override int Y

{

get { return y+100; }

}

}

static void Main(string[] args)

{

newperson p = new newperson();

Console.WriteLine(p.X);

Console.WriteLine(p.Y);

p.function();

Console.WriteLine(p.X);

Console.WriteLine(p.Y);

Console.ReadKey();

}

 

2. virtual關鍵字用於修飾方法、屬性、索引器或事件聲明,並使它們可以在衍生類別中被重寫。虛擬成員的實現可由衍生類別中的重寫成員更改。調用虛方法時,將為重寫成員檢查該對象的運行時類型。將調用大部指派生類中的該重寫成員,如果沒有衍生類別重寫該成員,則它可能是原始成員。預設情況下,方法是非虛擬。不能重寫非虛方法。virtual 修飾符不能與 static、abstract, private 或 override 修飾符一起使用。和抽象方法的相同點是都用了override關鍵字進行重寫方法,不同點是抽象方法必須存在於抽象類別中,而子類必須重寫,除非子類也是抽象的。

public class Dimensions

{

public const double PI = Math.PI;

protected double x;

protected double y;

public Dimensions() { }

public Dimensions(double x, double y)

{

this.x = x;

this.y = y;

}

public virtual double Area()

{

return x * y;

}

}

public class Circle : Dimensions

{

public Circle(double r) : base(r,0) { }

 

public override double Area()

{

Console.WriteLine(base.Area());

return PI * x * x;

}

}

public class Sphere : Dimensions

{

public Sphere(double r) : base(r,0) { }

public override double Area()

{

return 4 * PI * x * x;

}

}

public class Cylinder : Dimensions

{

public Cylinder(double r, double h) : base(r, h) { }

public override double Area()

{

return 2 * PI * x * x + 2 * PI * x * y;

}

}

static void Main(string[] args)

{

Dimensions P = new Circle(5.0);

Sphere sphere = new Sphere(10);

Cylinder cylinder = new Cylinder(10, 10);

Console.WriteLine(P.Area());

Console.WriteLine(sphere.Area());

Console.WriteLine(cylinder.Area());

Console.ReadKey();

}

 

3.override 方法提供從基類繼承的成員的新實現。由 override 聲明重寫的方法稱為重寫基方法。重寫的基方法必須與 override 方法具有相同的簽名。不能重寫非虛方法或靜態方法。重寫的基方法必須是 virtual、abstract 或 override 的。 override 聲明不能更改 virtual 方法的可訪問性。 override 方法和 virtual 方法必須具有相同的存取層級修飾符。重寫屬性聲明必須指定與繼承屬性完全相同的存取修飾詞、類型和名稱,並且被重寫的屬性必須是 virtual、abstract 或 override 的。

4. base和this的區別

1)base作用:用於從衍生類別中訪問基類的成員,調用基類上已被其他方法重寫的方法。指定建立衍生類別執行個體時應調用的基類建構函式。

註:從靜態方法中使用 base 關鍵字是錯誤的。
2)區別:

base 是子類中引用父類,用於在衍生類別中訪問重寫的基類成員。
this 是當前類,引用自己,用於訪問本類的成員,當然也包括繼承而來公有和保護成員。

3)注意:
a).在靜態成員中使用base和this都是不允許的。原因是,base和this訪問的都是類的執行個體,也就是對象,而靜態成員只能由類來訪問,不能由對象來訪問。
b).base是為了實現多態而設計的。
c).使用this或base關鍵字只能指定一個建構函式,也就是說不可同時將this和base作用在一個建構函式上。
d).除了base,訪問基類成員的另外一種方式是:顯示的類型轉換來實現。只是該方法不能為靜態方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.