C# 高级编程(笔记2)
第四章
1.接口
public interface ITty { void Put(); }
a.一般情况下,接口只能包含方法、属性、索引器和事件的声明。不允许提供接口中任何成员的实现方式,只声明没有实现。
b.不能有构造函数,接口中的成员不能有访问修饰符,因为接口本来就是公共的(public),
c.只要一个类继承了接口,它就得为接口中的所有方法提供实现
2.隐藏方法
如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有分别声明为virtual 和 override,派生类方法就会隐藏基类方法。在大多数清况下是要重写方法,而不是隐藏方法,因为隐藏方法会造成对于给定类的实例调用错误方法的危险。
public class HisBaseC1ass { public String MyGroovyMeth() { return("Base Class"); } } public class MyDerivedC1ass : HisBaseC1ass { public String MyGroovyMeth() { return ("My Derived C1ass"); } } MyDerivedC1ass derived = new MyDerivedC1ass(); Console.WriteLine( derived.MyGroovyMeth());//输出为“My Derived C1ass” //调用子类自己的,并不是调用从父类中继承下来的,即子类中覆盖了父类中的方法,正确明了的写法是用关键字new, //上面的写法,编译器会认为是隐式的覆盖 public class MyDerivedC1ass : HisBaseC1ass { public new String MyGroovyMeth() { return ("My Derived C1ass"); } }
3.抽象类
public abstract class AbstrTty { public void Get() { } public abstract void Push();【没有方法体】 }
a.该类不能被实例化,该类中除了可以和其他普通类一样,声明相关方法,属性等之外,还可以声明抽象方法,抽象方法没有方法体,派生类必须用override来重写其继承下来的抽象方法。
b.抽象方法与虚方法的区别
1)父类可以只声明虚方法,不提供实现;也可以提供实现【注意:都有方法体】
public class Animal { public virtual void Sleep(){console.writeline(...);}//提供了实现 public virtual void Eat(){}//没有提供实现 }
2)子类中必须用override来重写继承下来的所有抽象方法;对于虚方法,可以用override来重写,也可以不必重写
4.定义和实现接口
public interface IBankAccount { void PayIn(); void Withdraw(); } public class A: IBankAccount { void PayIn(){...} void Withdraw(){...} } public class B: IBankAccount { void PayIn(){...} void Withdraw(){...} }
IBankAcoount a = neW A();
IBankAccount b = neW B();
//重要的是a,b这两个接口类型变量的声明形式,这表示它们可以指向实现这个接口的任何类的任何实例。这样得到的a,b只能访问类A,类B中从IBankAcoount接口中继承下来的所有方法,但如果类A,类B中还包括了它们自己另外定义的成员时,a,b是不能访问到的
5.派生的接口
接口可以彼此继承,C#中接口可以多继承
public interfaCe ITransferBankACcount: IBankAccount { bool TransferTo(IBankACcount destinatio, decima amount); }
//因为ITransferBankACcount派生自IBankAccount,所以它拥有IBankAccount的所有成员和它自己的成员。这表示派生自ITransferBankACcount的任何类都必须实现IBankAccount的所有方法以及在ITransferBankAccomt中定义的新方法TransferTo