轉載自:https://www.cnblogs.com/akwwl/archive/2012/08/03/2622026.html
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,訪問基類成員的另外一種方式是:顯示的型別轉換來實作,只是該方法不能為靜態方法,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/286517.html
標籤:C#
上一篇:WPF實作音樂字幕影片
