C# 單一類別繼承、多介面實作。繼承分「實作繼承」(擁有基底所有成員) 與「介面繼承」(僅簽名)。結構隱含繼承 ValueType 並可實作多介面。
public class BaseClass
{
public string GetUrl() { return "www.gosoa.com.cn"; }
}
public class Test : BaseClass
{
static void Main()
{
Test t = new Test();
Console.WriteLine(t.GetUrl()); // 繼承基底方法
}
}
virtual 允許覆寫。override 明確覆寫。virtual。
public class BaseClass
{
public virtual string GetUrl() { return "cnblogs.com"; }
}
public class BaseClass2 : BaseClass
{
public override string GetUrl() { return "gosoa.com.cn"; }
}
public class Test : BaseClass2
{
public override string GetUrl() { return "www.gosoa.com.cn"; }
static void Main() { Console.WriteLine(new Test().GetUrl()); } // www.gosoa.com.cn
}
衍生類別未加 override 時為隱藏 (new),編譯警告。隱藏不具多型行為。
public class Test : BaseClass2
{
public override string GetUrl()
{
string url = "https://";
url += base.GetUrl(); // 呼叫 BaseClass2 版本
return url;
}
static void Main() { Console.WriteLine(new Test().GetUrl()); } // https://gosoa.com.cn
}
abstract:不可實例化,可含抽象方法 (無主體),衍生類別必須實作。sealed:類別不可被繼承;方法不可被覆寫。基底 → 衍生 依序執行。透過 base(參數) 顯式呼叫特定基底建構函式。
public class UserBase
{
private string username;
public UserBase() { Console.WriteLine("I'm good men"); }
public UserBase(string username) { this.username = username; }
}
public class OneMen : UserBase
{
public OneMen() { Console.WriteLine("Yes, I'm very good!"); }
public OneMen(string username) : base(username) { Console.WriteLine(username + " is a good men!"); }
public OneMen(string username, string site) : base(username) { Console.WriteLine(username + "'s site is " + site); }
static void Main()
{
new OneMen(); // I'm good men / Yes...
new OneMen("pan"); // pan is a good men!
new OneMen("pan", "www.gosoa.com.cn"); // pan's site is www.gosoa.com.cn
}
}
virtual/override 實現多型,base 復用基底邏輯。sealed 保護核心邏輯不被修改,abstract 強制衍生類別實作契約。