下面实例定义了一个抽象类和一个接口,抽象类中定义一个手机的属性和方法,接口定义一个玩游戏的方法。
抽象类代码:
//抽象类是一个父类+约束 父类是为了实现代码重用 约束是为了多态变化 单继承 is a
public abstract class BasePhone
{
public int Id { get; set; }
public string Name { get; set; }
public string Branch { get; set; }
public abstract void System();//约束下子类有这个方法 但又各不相同
public void Call()
{
Console.WriteLine($"Use {this.GetType().Name} Call");
}
public void SendMsg()
{
Console.WriteLine($"Use {this.GetType().Name} SendMsg");
}
}
接口代码:
//接口就是一个约束 一个类可以实现多个接口 告诉别人一定有什么功能 can do
public interface IExted
{
void PlayGame();
}
定义小米手机类,继承抽象类BasePhone,并实现接口:
public class Mi : BasePhone, IExted
{
public void PlayGame()
{
Console.WriteLine($"Use {this.GetType().Name} PlayGame");
}
public override void System()
{
Console.WriteLine($"{this.GetType().Name} System is Android ");
}
}
定义苹果手机类,继承抽象类BasePhone,并实现接口:
public class iPhone : BasePhone, IExted
{
public void PlayGame()
{
Console.WriteLine($"Use {this.GetType().Name} PlayGame");
}
public override void System()
{
Console.WriteLine($"{this.GetType().Name} System is IOS ");
}
}
实例化对象并调用方法:
class Program
{
static void Main(string[] args)
{
iPhone iphone = new iPhone();
iphone.System();
iphone.Call();
iphone.SendMsg();
iphone.PlayGame();
iphone.Id=1;
Mi mi = new Mi();
mi.System();
mi.Call();
Console.ReadLine();
}
}
执行结果:
苹果手机和小米手机都有手机共同的属性和方法,比如打电话(Call),发送短信(SendMsg),但是它们的操作系统不同,所以将操作系统方法(System)定义为抽象方法,在父类(BasePhone)中不做实现,子类去重写操作系统这个方法。
同时苹果手机和小米手机都可以玩游戏,所以将玩游戏(PlayGame)的方法定义在接口中,实现接口的类必须实现接口中的每一个方法。这样苹果手机和小米手机都拥有了玩游戏的方法。
之所以把玩游戏的方法定义在接口中,而不是在抽象类中。是这么考虑的,除了手机可以玩游戏外,平板和电视同样可以玩游戏,但是平板和电视不能打电话和发送短信。
总结:
抽象类可以理解为是一个父类+约束,父类是为了实现代码的重用,约束是为了多态变化。抽象类只能单继承。用英文表示抽象类这个概念的话可以表示为‘is a’,表示是个什么东西,比如上面的例子中的BasePhone,表示的就是手机。
接口就是纯粹的约束,告诉别人有什么功能。用英文表示接口这个概念的话可以表示为‘can do’,表示是能够做什么。
在实际开发中,首先考虑使用接口,如果有代码需要重用,则考虑使用抽象类。