c#面向对象程序设计——类的抽象

7.1类的抽象:

在面向对象思想中,所有的对象都可以通过类来描述。但并不是所有的类都是用来描述对象的,如果一个类中没有包含能够描述具体对象的信息,那么就称其为抽象类。
语法
abstract class 类名{}
特性:
1、抽象成员必须放在抽象类中。
2、抽象类中的成员不一定全是抽象成员
3、抽象类不能实例化
4、抽象类方法不能有具体的实现
5、所有被继承的抽象成员都应在子类中实现
6、子类必须实现父类所有的抽象成员
代码示例:

//定义父类电器类,因为所有的电器都能充电,所以在类中定义充电方法,但是电器只是抽象的概念,因此充电方法无法实现,只能定义抽象方法。
abstract class Appliance
{
	public abstract void Charge();
}
//定义电脑子类和手机子类继承于电器类,并在子类中重写父类方法
class Computer:Appliance{
	public override void Charge(){
		Console.WriteLine("电脑使用220v电压充电")
	}
}
class Phone:Appliance{
	public override void Charge(){
		Console.WriteLine("手机使用110v电压充电")
	}
}
//创建电脑和手机对象,并调用充电方法
static void Main(string[] args){
	Appliance cpt=new Computer();
	Appliance mp=new Phone();
	cpt.Charge();
	mp.charge();
}

7.2接口:

c#中子类最多只允许有一个父类,如果一个类需要具有多个类的特征或行为,那么就可以通过接口实现。c#中的接口用于约束类的行为。
自定义接口语法:

[访问修饰符] interface 接口名{}

注意点
1、接口名一般使用大写字母"I"开头,表明它是接口类型
2、接口可包含方法、属性、事件和索引器,但不能包含字段
3、接口中定义的成员不允许有具体实现
代码示例一

class Person:IComparable<Person>
{
    private string name;
    private int age;
    public Person(){}
    public Person(string name,int age){
    	this.Name = name;
    	this.Age = age;
    }
    public string Name{
    	get { return name; }
    	set { name = value; }
    }
    public int Age{
    	get { return age; }
    	set { age = value; }
    }
    public void Show(){
    	Console.WriteLine("大家好,我叫{0},今年{1}岁",this.Name,this.Age);
    }
    public int CompareTo(Person other){
    	return this.Age.CompareTo(other.Age);//年龄递增
    	//年龄递减return other.Age.CompareTo(this.Age);
    }
}
static void Main(string[] args){
	Person ma = new Person("张三", 22);
	Person lei = new Person("李四", 20);
	Person chen = new Person("王五", 21);
	List<Person> list = new List<Person>();
	list.Add(ma);
	list.Add(lei);
	list.Add(chen);
	foreach(Person item in list){
		item.Show();
	}
	list.Sort();
	Console.WriteLine("=====================排序后===================");
	 foreach(Person item in list){
  		item.Show();
	 }
}

代码示二:

//自行车接口
class IBicycle{
	public interface IBicycle(){
		//使用方法
		void UsageMethod();
	}
}
//电机接口
calss IElectromotor{
	public interface IElectromotor(){
	        //充电方法
	        void Charging();
	}
}
public class EIectricBicycle{
	private string brand;
	public string Brand{
     		get { return brand; }
     		set { brand = value; }
    	}
    	public void UsageMethod(){
    		Console.WriteLine("{0}电动车是用电机驱动的",Brand)}
    	public void Charging(){
    		Console.WriteLine("{0}电动车的充电电压 为220v",Brand)}
}
static void Main(string[] args){
	EIectricBicycle eb=new EIectricBicycle();
	eb.Bran="天马";
	eb.UsageMethod();
	eb.Charging();
}

7.3抽象类和接口的区别:

抽象类接口
使用abstract关键字使用interface关键字
可以包含字段和已实现成员不能包含字段,只能包含未实现的成员
子类通过override实现抽象方法子类直接实现所有成语

代码示例:

//妖怪抽象类
public abstract class Monster
{
       private string name;//名字
       private int hp;//生命值
       private int mp;//魔法值
       public string Name{
       	get { return name; }
       	set { name = value; }
       }
       public int Hp{
       	get { return hp; }
       	set { hp= value; }
      }
      public int Mp{
       get { return mp; }
       set { mp = value; }
      }
  //显示基本信息
     public void ShowInfo(){
            Console.WriteLine("{0}的生命值和魔法值为{1},{2}",Name,Hp,Mp);
     }
     //恢复生命值
     public virtual void AutomaticHp(){
             Console.WriteLine("{0}自动恢复生命值,{2}",Name);
     }
}
//英雄和妖怪都有攻击的方法
public interface IAttack{
	//物理攻击
	void PhysicalAttack();
	//魔法攻击
	void MagicalAttack();
}
public class Fox:Monster,IAttack{
        public void PhysicalAttack(){
        	Console.WriteLine("狐妖的物理攻击是“金刚爪”。");
        }
        public void MagicalAttack(){
        	Console.WriteLine("狐妖的魔法攻击是“妖气爪”。")
        }
}
static void Main(string[] args){	
	Fox fox=new Fox(){Name="小狐狸",Hp=10000,Mp=4000};
	fox.ShowInfo();
	fox.AutomaticHp();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值