1.接口
接口是一个规约,是一种能力,当你遵循这个规约的时候就获得了这种能力
定义接口使用interface 关键字
一般接口名要以大写I开头
接口中只能包含方法【属性、事件、索引器最终都是方法,所以可以说接口中只能包含方法】
接口中的成员不能有任何访问修饰符,默认是public,如果手动写了访问修饰符这报错!!!!
接口中的成员不能有任何实现,就像抽象方法一样不能有实现
接口中的属性也必须交给实现该接口的类来实现
当一个抽象类实现某个接口的时候,如果实现的时候把接口中的成员标记为了abstract ,同时该类也是一个抽象类,此时可以不对接口中的成员进行实现。
当子类抽象不出来一个父类的时候会用到接口
例如:鸟和飞机都会飞。但是鸟和飞机不属于同一个父类,这时候就可以用接口
一个类只有一个父类,但可以实现多个接口,写的时候要把父类写在最前边
public class RubberDuck : Duck, IBarkable
{
public void Bark()
{
Console.WriteLine("唧唧叫!!!!!");
}
}
Person类实现了IIntroduce接口,并且把接口中的Introduce()方法实现成虚方法,所以继承Person类的子类就可以重写该方法了。
//创建一个接口
public interface IIntroduce
{
// 介绍说明自己的情况
void Introduce();
}
//创建一个类把接口中方法显现为虚方法
class Person : IIntroduce
{
public virtual void Introduce()
{
}
}
//子类重写父类虚方法
class American : Person, IIntroduce
{
public override void Introduce()
{
Console.WriteLine("社会保险号:00000");
}
}
>显示实现接口
实现接口的时候在方法名前面加 接口名.方法名() 就叫做显示实现接口。
//显示实现接口的访问修饰符默认是没有的,类中成员没有写访问修饰符这默认就是private
//显示实现接口是私有的所以必须通过接口名才能访问的到。
public void Fly()
{
Console.WriteLine("实现了IFace1中的Fly方法。");
}
//其中IFace1为隐式实现,IFace2为显示实现
void IFace2.Fly()
{
Console.WriteLine("实现了IFace2中的Fly方法。");
}
当两个接口中的方法名字相同时可以用显示实现
2.异常处理
try
{
//可能出现异常的代码!!
//在try块中的代码,如果一旦某句代码发生了异常,这从该条语句直接跳转到catch 块中,在try 块中该条语句后续的代码不会继续执行了。
}
catch
{
//当try块中的代码发生异常后,执行这里的代码
//如果try块中的代码没有发生异常,这不会执行catch 块中的代码
}
finally
{
//无论try块中的代码是否发生异常,都会执行这里的代码
}
手动抛出一个异常。
throw new Exception();
可以写多个catch块
try
{
object o = null;
Console.WriteLine(o.ToString());
//除数不能为0,如果为0,则报异常!!!
int r = apples / m;
Console.WriteLine(r);
}
//一个try块可以跟多个catch块,这样就可以对不同的异常进行不同的处理。最后可以再加一个catch,参数是Exception ,这样就可以把所有的异常都捕获到了。
catch (NullReferenceException ex)//空指针
{
Console.WriteLine(ex.Message);
}
catch (DivideByZeroException ex)//除0
{
Console.WriteLine(ex.Message);
}
catch (ArgumentException ex)//传递非法参数
{
Console.WriteLine(ex.Message);
}
catch (FileNotFoundException ex)//文件未找到
{
Console.WriteLine(ex.Message);
}
catch (Exception ex)//所有异常信息
{
Console.WriteLine(ex.Message);
}
finally
{
//执行最终的善后处理,比如资源释放,因为无论程序执行是否发生异常都需要释放资源。
Console.WriteLine("这里是finally中的代码1!!!");
}
while (true)
{
Console.WriteLine("请输入一个姓名:");
string name = Console.ReadLine();
//一般最好使用if-else等这些逻辑判断,避免使用异常。使用异常效率不高。
if (name.StartsWith("张"))
{
//手动抛出一个异常。
throw new Exception("不能是姓张的。");
}
else
{
Console.WriteLine("姓名是:" + name);
}
}
Console.WriteLine("ok");
Console.ReadKey();
<pre name="code" class="csharp"> //如果在catch块中使用了throw,则后面的代码如果不放在finally中,就不会执行。
//Console.WriteLine("M1方法的finally中的代码。。。");
//手动抛出一个异常。
//throw new Exception();