继承和多态的使用 3个月前

编程语言
466
继承和多态的使用

继承

在创建一个新类时,我们可以使用这个新定义的类继承一个已有的类,通过继承可以在创建新类时重用、扩展和修改被继承类中定义的成员。被继承的类称为“基类(父类)”,继承基类的类称为“派生类(子类)”。

需要注意的是,C# 中只支持单继承,也就是说一个派生类只能继承一个基类,但是继承是可以传递的,例如 ClassC 继承了 ClassB,而 ClassB 继承了 ClassA,那么 ClassC 将继承 ClassB 和 ClassA 中的所有成员。

1、基类和派生类

要使用一个类继承另一个类需要使用到冒号:,如下所示:

class 派生类 : 基类{
... ...
}

【示例】下面通过一个示例来演示一下基类和派生类的实现:

using System;
namespace xiaobai
{
    class Demo
    {
        static void Main(string[] args) 
        {
            Rectangle oblong = new Rectangle();
            oblong.setWidth(3);
            oblong.setHeight(4);
            int area = oblong.getArea();
            Console.WriteLine("长方形的面积为:{0}", area);
        }
    }
    // 基类
    class Shape{
        protected int width, height;
        public void setWidth(int w){
            width = w;
        }
        public void setHeight(int h){
            height = h;
        }
    }
    // 派生类
    class Rectangle : Shape{
        public int getArea(){
            return width*height;
        }
    }
}

运行结果如下:

长方形的面积为:12

2、多重继承

与单继承相反,多重继承则是指一个类可以同时继承多个基类,C# 并不支持多重继承,但是可以借助接口来实现多重继承。下面就通过一个示例来演示一下:

using System;
namespace xiaobai
{
    class Demo
    {
        static void Main(string[] args) 
        {
            Rectangle oblong = new Rectangle();
            oblong.setWidth(3);
            oblong.setHeight(4);
            int area = oblong.getArea();
            int girth = oblong.getGirth();
            Console.WriteLine("长方形的面积为:{0}", area);
            Console.WriteLine("长方形的周长为:{0}", girth);
        }
    }
    // 基类
    class Shape{
        protected int width, height;
        public void setWidth(int w){
            width = w;
        }
        public void setHeight(int h){
            height = h;
        }
    }
    // 定义接口
    public interface Perimeter{
        int getGirth();
    }
    // 派生类
    class Rectangle : Shape, Perimeter{
        public int getArea(){
            return width*height;
        }
        public int getGirth(){
            return (width+height)*2;
        }
    }
}

运行结果如下:

长方形的面积为:12
长方形的周长为:14

多态

  • 编译时多态:通过 C# 中的方法重载和运算符重载来实现编译时多态,也称为静态绑定或早期绑定;
  • 运行时多态:通过方法重载实现的运行时多态,也称为动态绑定或后期绑定。

1、编译时多态

在编译期间将函数与对象链接的机制称为早期绑定,也称为静态绑定。C# 提供了两种技术来实现编译时多态,分别是函数重载和运算符重载,本节主要来介绍一下函数重载,运算符重载会在后面进行讲解。

函数重载

在同一个作用域中,可以定义多个同名的函数,但是这些函数彼此之间必须有所差异,比如参数个数不同或参数类型不同等等,返回值类型不同除外。 定义名为 print 的函数来打印不同类型的数据:

using System;
namespace c.biancheng.net
{
    class Demo
    {
        void print(int i){
            Console.WriteLine("打印 int 类型的数据:{0}", i);
        }
        void print(double d){
            Console.WriteLine("打印 double 类型的数据:{0}", d);
        }
        void print(string s){
            Console.WriteLine("打印 string 类型的数据:{0}", s);
        }
        static void Main(string[] args) 
        {
            Demo p = new Demo();
            p.print(123);
            p.print("C语言中文网");
            p.print(3.1415926);
        }
    }
}

运行结果如下: 打印 int 类型的数据:123 打印 string 类型的数据:C语言中文网 打印 double 类型的数据:3.1415926

2、运行时多态

C# 允许您使用 abstract 关键字来创建抽象类,抽象类用于实现部分接口。另外,抽象类包含抽象方法,可以在派生类中实现。

下面列举了一些有关抽象类的规则:

  • 不能创建一个抽象类的实例;
  • 不能在一个抽象类外部声明抽象方法;
  • 通过在类定义时使用 sealed 关键字,可以将类声明为密封类,密封类不能被继承,因此抽象类中不能声明密封类。

下面的程序演示了一个抽象类:

using System;
namespace hellowrold
{
    abstract class Shape{
        public abstract int area();
    }
    class Rectangle : Shape{
        private int width, height;
        public Rectangle(int w, int h){
            width = w;
            height = h;
        }
        public override int area(){
            return (width * height);
        }
    }
    class Demo
    {
        static void Main(string[] args) 
        {
            Rectangle r = new Rectangle(12,15);
            double a = r.area();
            Console.WriteLine("长方形的面积为: {0}",a);
            Console.ReadKey();
        }
    }
}

运行结果如下: 长方形的面积为: 180

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223162
累计阅读

热门教程文档

Java
12小节
爬虫
6小节
Golang
23小节
Spring Boot
24小节
Javascript
24小节