面向对象三要素:封装、继承、多态。
封装和继承,这两个比较好理解,但要理解多态的话,可就稍微有点难度了。今天,咱们就来说讲多态的理解。
咱们应该常常会看到面试题目:请谈谈对多态的理解。
其实呢,多态很是简单,就一句话:调用同一种方法产生了不一样的结果。
具体实现方式有三种。面试
重载很简单。ide
public string GetValue(string x) { return x; } public string GetValue(string x, string y) { return x+y; } //调用 string myValue=GetValue("测试"); string myValue2=GetValue("测试","方法");//调用了GetValue同一种方法,只是多了个参数,但仍是算得上“同一种方法”。
public class BaseClass { public virtual void GetValue() //virtual关键字,供后面的子类重写该方法 { Console.WriteLine("这是个虚方法"); } } public class MyClass: BaseClass { public override void GetValue() { Console.WriteLine("MyClass重写了基类的虚方法"); } } public class NewClass: BaseClass { public override void GetValue() { Console.WriteLine("NewClass重写了基类的方法"); } } public class Program { static void Main() { BaseClass baseClass=new BaseClass(); MyClass myClass=new MyClass(); NewClass newClass=new NewClass(); //在这里你会无心间想到一句很经典的话:不一样的对象调用了同一种方法产生了不一样的行为 baseClass.GetValue();//这是个虚方法 myClass.GetValue();//MyClass重写了基类的虚方法 newClass.GetValue();//NewClass重写了基类的方法 } }
关于继承,仍是要谈一下is和as运算符的
咱们都知道,全部的类都是默认继承System.Object这个类的,也就是说全部的类均可以转化为Object。子类能够转换为父类,毕竟子类就属于父类。
在上面这个例子,MyClass类是继承BaseClass类的,也就是说MyClass能够转为BaseClass。可能,咱们会想到强制转换 baseClass=(BaseClass)myClass,这样作是能够的,但若是myClass继承的不是BaseClass则会抛出异常,这样很差。这时,应该用as与is运算符,BaseClass baseClass = myClass as BaseClass,这句话,若是运行出错的话,会将null赋值给baseClass,也就是说,在使用baseClass这个对象以前,咱们只需判断是否为空就好了。测试
MyClass myClass = new MyClass(); BaseClass baseClass = myClass as BaseClass;//即便转换的不会,只会将null赋值给baseClass,不会抛出异常。 if (baseClass != null)//只需判断一下是否为空便可 { baseClass.GetValue(); } if(myClass is baseClass) { Console.WriteLine("myClass是属于baseClass的"); }
老生常谈,抽象类是不能够实例化的,抽象类的目的就是为了让其余类继承,并且只能继承一个类,若是想要实现多重继承,便诞生了接口。设计
public abstract class BaseClass { public abstract void GetValue();//抽象方法,不能有方法实体 public void GetValue2() { Console.WriteLine("实体方法");//抽象类能够有实体方法,抽象类是不能够实例化的,但他的子类的实例能够调用这个方法 } } public class MyClass: BaseClass { public override void GetValue() { Console.WriteLine("MyClass重写了基类的虚方法"); } } public Class NewClass: BaseClass { public override void GetValue() { Console.WriteLine("NewClass重写了基类的方法"); } } public class Program { static void Main() { MyClass myClass=new MyClass(); NewClass newClass=new NewClass(); myClass.GetValue(); myClass.GetValue2();//子类的实例能够调用这个方法 newClass.GetValue(); } }
注意点:
一、好好体会多态的实现,渐渐地会发现面向对象程序设计的魅力。code
二、抽象类的目的就是为了继承,想要实现多重继承,就须要接口了。对象
三、抽象类不能够实例化,它是能够有实体方法的,继承这个抽象类的实例能够调用抽象类里面的实体方法。继承
四、会熟练使用is和as运算符,不要一味地使用强制转换接口