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

原文地址:https://www.cnblogs.com/notebook2011/p/2969414.html