zoukankan      html  css  js  c++  java
  • C#编程语言与面向对象——抽象基类与接口

    在一个类前加“abstract”关键字,此类就成为抽象类。

    对应的,在一个方法前加“abstract”关键字,此方法就成为抽象方法。

    abstract class Fruit    //抽象类
    {
            public abstract void GrowInArea();//抽象方法
    }

      注意抽象方法不能又实现代码,在方法名后直接跟一个分号。

      抽象类专用于派生出子类,子类必须实现抽象类中所生命的方法。否子子类仍是抽象类。

      抽象类一般用于表达一种比较抽象的事物,比如说“水果”,而抽象方法则说明此抽象类应该具有的某种特性。比如Fruit类中有一个抽象方法GrowInArea(),说明水果一定有一个最适合其生长的地区,但不同的水果生长是不同的。

      从统一抽象类中继承的子类拥有相同的方法(及抽象类所定义的抽象方法),但这种方法的具体代码每个类都可以不一样。

      如:

      

    class Apple:Fruit    //苹果类
    {
            public override void GrowInArea()
            {
                Console.WriteLine("南北方都可以种植。");
            }
    }    
    class Pineapple:Fruit    //菠萝
    {
            public override void GrowInArea()
            {
                Console.WriteLine("只在南方种植。");
            }
    }    

    上述代码中的override关键字,说明子类重写了基类的抽象方法,抽象类不能创建对象,一般用它来引用子类对象。

    Fruit f;
    f=new Apple();
    f.GrowInArea();
    f=new Pineapple();
    f.GrowInArea();

    结果:

    南北方都可以种植。
    只在南方种植。

    上述几段代码所说,f 所引用的对象不同而输出不同的结果。

    可以按照以下公式编写代码:

    抽象类 抽象类变量名=new 继承自此抽象类的具体子类名();

    一个抽象类中可以包含非抽象的方法和字段。因此:

    包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法。

    抽象属性

    abstract class Parent
    {
        public abstract String Message    //抽象属性
        {
            get;set;
        }
    }    
    
    class Child:Parent
    {
        private String _msg;
        public override String Message
        {
            get
            {
                return _msg;
            }
            set
            {
                _msg=value;
            }
        }
    }    

    代码使用:

    Parent p =new Child();
    p.Message="Hello";

    接口

    举个例子

    鸭子是一种鸟,会游泳,同时又是一种食物。

    如何在面向对象的程序中表达这种关系?

    因为在C#中无法继承两个类,所以为了解决这一问题,C#引入了接口(interface),并规定”一个类可以实现多个接口“。

    关键在interface用于定义接口

    //定义两个接口
    public interface ISwim
    {
        void Swim();
    }
    
    public interface IFood
    {
        void Cook;
    }

    接口可以看成一种”纯“的抽象类,接口的所有方法都是抽象方法。

    //定义一个抽象类
    public abstract class Bird
    {
        public abstract void Fly();
    }
    
    //继承自一个抽象类,实现两个接口
    public class Duck:Bird,IFood,ISwim
    {
        //实现ISwim接口
        public void Swim()
        {
            Console.WriteLine("是鸭子就会游泳。");
        }
    
        //实现IFood接口
        public void Cook()
        {
            Console.WriteLine("鸭子经常被烧烤。");
        }
    
        //实现抽象类Brid中的抽象方法
        public override void Fly()
        {
           Console.WriteLine("只有野鸭才会飞");
        }
    }    

    使用:

    接口类型名 变量名=new 实现了接口的类型名();

    代码:

    static void Main(string[] args)
    {
        Duck d =new Duck();
        //Duck对象d可以使用3中方法:
    
        //1.自行定义的;
    
        //2.父类定义的
    
        //3.接口定义的
    
        d.Fly();
    
        d.Cook();
    
        d.Swim();
    
        //将子类(Duck)对象赋给基类变量
    
        Bird b=d;
    
        //现在只能使用基类定义的Fly()方法
    
        b.Fly();
    
        //将Duck对象赋给ISwim接口变量
    
        ISwim s=d;
    
        //现在只能使用接口定义的Swim()方法
    
        s.Swim();
    
        //将Duck对象赋给另一个实现的接口IFood接口变量
    
        IFood f=d;
    
        //现在只能使用接口定义的Cook()方法
    
        f.Cook();
    
    }    

    虽然程序中使用都只有一个Duck对象,但将其赋值给不同类型的变量后,其可以使用的方法是不一样的。

    显示实现接口

    当某个类实现多个接口,创建一个此类的对象之后,通过引用这个对象的对象变量可以访问其所有的公有方法(包括自身的公有方法以及有接口定义的公有方法)。这种情况下,就分不清哪些方法是由接口提供,那些是有自己定义的。而C#提供饿了一种”显示接口“实现机制,区分这两种情况。

    interface IMyInterface
    {
        void func();
    }
    
    public class A:IMyInterface
    {
        void IMyInterface.func()
        {
            //...
        }
    
        public void func2()
        {
            //...
         }
    }

    用粗体表示的就是C#对接口IMyInterface的显示实现方式。

    当类A显示实现接口IMyInterface后,只能以下面方式访问接口定义的方法:

    IMyInterface a=new A();
    a.func();

    所以说:被显示实现的接口方法只能通过接口实例访问,而不能通过类实例直接访问。

  • 相关阅读:
    兄弟连学python——MongoDB相关
    兄弟连学python——redis相关
    python学习——tkinter实战(猜价格)
    python学习——tkinter实战(计算器)
    python学习——while实战小练习
    python学习——循环结构
    python学习——数据类型转换
    python学习——通过while循环语句实现九九乘法表的四种表达方式
    python—Html表单
    python—Redis简介及应用
  • 原文地址:https://www.cnblogs.com/guyg/p/3885121.html
Copyright © 2011-2022 走看看