C#中的继承与多态还有接口

简单继承

最简单的三个类

public class Animal {
    public Animal()
    {
        Debug.Log("Construct Animal!");
    }
}

public class Mammal : Animal {
    public Mammal()
    {
        Debug.Log("Construct Mamal!");
    }
}

public class Sheep : Mammal
{
    public Sheep()
    {
        Debug.Log("Construct Sheep!");
    }
}

在main里面

Sheep sheep = new Sheep();

子类的构造函数会依次执行基类的构造函数,没有异议。

需要注意的是,没有特别声明,子类都会自动去找父类中没有参数的构造函数,如果基类中没有,则需要在子类的构造函数中调用,比如:

public class Animal{

    int age;
    public Animal(int _age)
    {
        age = _age;
        Debug.Log("Construct Animal!");
    }
}

则子类的构造函数就要这样写

    public Mammal():base(0)
    {
        Debug.Log("Construct Mamal!");
    }

在基类Animal中添加函数

    public void Eat()
    {
        Debug.Log("Animal Eat!");
    }

下面谈一下方法的覆盖

在子类Sheep中覆盖定义Eat方法

    public new void Eat()
    {
        Debug.Log("Sheep Eat!");
    }

这里的new关键字表示隐藏基类中的方法,官方解释如下:

new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员时,该成员的派生版本将替换基类版本。虽然可以不使用 new 修饰符来隐藏成员,但将收到编译器警告。如果使用 new 来显式隐藏成员,将禁止此警告。

测试代码:

        Sheep sheep = new Sheep();
        Animal animal = new Sheep();

        sheep.Eat();
        animal.Eat();

结果是这样的

没有发生多态行为,声明的基类对象,执行的就是基类方法,声明的子类对象,执行的就是子类方法。

在子类的函数中,都有一个base变量,可以认为是一个对基类的引用,通过base就可以调用基类的方法。

多态

多态就是多态就是父类引用指向子类对象,调用方法时会调用子类的实现,而不是父类的实现,这叫多态。

基类Animal中定义函数

    public virtual void Birth()
    {
        Debug.Log("Animal Birth!");
    }

Sheep中overrride一下

    public override void Birth()
    {
        Debug.Log("Sheep Birth!");
    }

测试代码

        Sheep sheep = new Sheep();
        Animal animal = new Sheep();
        animal.Birth();

执行结果

有下面两个需要注意的点

1.子类调用父类的方法

当然是直接用base了。

2.继承链中的虚方法

无论在虚拟成员和最初声明虚拟成员的类之间已声明了多少个类,虚拟成员永远都是虚拟的。如果类 A 声明了一个虚拟成员,类 B 从 A 派生,类 C 从类 B 派生,则类 C 继承该虚拟成员,并且可以选择重写它,而不管类 B 是否为该成员声明了重写。

Sealed关键字的用法

Sealed关键字用来阻止派生类重写虚拟成员。还是举例说明。

基类Animal中定义方法

public virtual void Move()
{
    Debug.Log("Animal Move!");
}

Mammal中sealed override这个函数

    public sealed override void Move()
    {
        Debug.Log("Mammal Move!");
    }

这时候在Sheep中已经无法overide这个函数了,因为在Sheep看来,基类的Move是被当作一个普通函数来处理的,如果要定义自己的Move函数,就要加new,像这样

    public new void Move()
    {
        Debug.Log("Sheep Move!");
    }

写点代码来测试多态性

        Animal animal = new Animal(1);
        Animal animal1 = new Mammal(1);
        Animal animal2 = new Sheep();
        Sheep sheep = new Sheep();

        animal.Move();
        animal1.Move();
        animal2.Move();
        sheep.Move();

运行结果

第一个无话可说,直接执行了Animal的move函数

第二个,正常的多态

第三个有点意思,多态到Mammal就打住了

第四个就是普通的执行Sheep类的成员函数。

abstract关键字的使用

官方解释:abstract 修饰符指示所修饰的内容缺少实现或未完全实现。abstract 修饰符可用于类、方法、属性、索引器和事件。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

接地气的解释:abstract类用于搭建子类的框架,子类必须实现其中的abstract方法,使用的也是override关键字。

abstract方法和vitual方法的区别

abstract方法没有函数体,子类一定要有对应方法的实现。

vitual方法子类可以选择实现也可以选择不实现。

两个都可以用于实现多态。

抽象类不能实例化。抽象类的用途是提供一个可供多个派生类共享的通用基类定义。例如,类库可以定义一个抽象类,将其用作多个类库函数的参数,并要求使用该库的程序员通过创建派生类来提供自己的类实现。

接口

接口包含类或结构可以实现的一组相关功能的定义。
例如,使用接口可以在类中包括来自多个源的行为。 由于C#语言不支持多重继承,所以该功能很重要。 此外,如果要模拟结构的继承,也必须使用接口,因为它们无法实际从另一个结构或类继承。

定义一个简单的接口,只有接口函数的定义,没有实现。

public interface ISay {

    void SayHello();
    void SayFuck();
}

Sheep继承ISay接口

public class Sheep : Mammal, ISay

则Sheep类中必须要有ISay中定义的接口的定义

    public void SayHello()
    {
        Debug.Log("ISay Hello");
    }

    public void SayFuck()
    {
        Debug.Log("ISay SayFuck");
    }

测试代码

        Sheep sheep = new Sheep();
        sheep.SayHello();
        sheep.SayFuck();

执行结果

接口有下面几个属性

接口类似于抽象基类。实现接口的任何类或结构都必须实现其所有成员。
接口无法直接进行实例化。其成员由实现接口的任何类或结构来实现。
接口可以包含事件、索引器、方法和属性。
接口不包含方法的实现。
一个类或结构可以实现多个接口。一个类可以继承一个基类,还可实现一个或多个接口。

参考

MSDN

时间: 2024-10-23 07:44:56

C#中的继承与多态还有接口的相关文章

C中的继承和多态

1.引言 继承和多态是面向对象语言最强大的功能.有了继承和多态,我们可以完成代码重用.在C中有许多技巧可以实现多态.本文的目的就是演示一种简单和容易的技术,在C中应用继承和多态.通过创建一个VTable(virtual table)和在基类和派生类对象之间提供正确的访问,我们能在C中实现继承和多态.VTable能通过维护一张函数表指针表来实现.为了提供基类和派生类对象之间的访问,我们可以在基类中维护派生类的引用和在派生类中维护基类的引用. 2.说明 在C中实现继承和多态之前,我们应该知道类(Cl

Objective-C中的继承和多态

面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多继承,为什么OC不支持多继承稍后将会提到.  说到继承呢,想到了一本书上是引用<大话西游>里的一句话来描述继承的.“人是人他妈生的,妖是妖他妈生的!”,想必里面的唐三藏也学过OOP编程,也许他们师徒四人去西天取什么算法导论呢,漫谈OOP编程啦,数据结构啦等这类的书去啦.人和妖都属于动物类,但各自有

java中封装,继承,多态,接口学习总结

### 一:封装java中封装是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通过严格的接口控制.封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段.适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性.***封装的优点***    1  良好的封装能够减少耦合.    2 类内部的结构可以自由修改.     3 可以对成员变量进行更精

JAVA继承、多态与接口

一.继承1.继承的优点 代码的重用性 子类可以扩展父类的属性和方法 设计应用程序变得更加简单 父类的属性和方法可用于子类2.如何判断类具有继承关系 类和类的关系 1)has-a(组合) 2)is-a(继承)3.单继承和多继承 单根性: 在java中,一个类只能有一个父类 传递性: 子类可以将父类的属性和方法传递给自己的子类4.所有类的根类都是Object(超类,基类)5.方法重写(以后多态的使用要用到)@Override//注解 1)子类的方法的返回值类型.方法名和形式参数列表, 必须和父类中的

python中的继承和多态

继承 继承的表现方式: class Animal(): pass class Cat(Animal): #animal是cat的父类,也可以说是基类 pass print(Cat.__bases__)#查看Cat的所有父类 单继承 一个类只有一个父类 狗和鸟都是动物,都拥有吃喝这两种技能,但游泳是狗的特殊技能,飞逝鸟的特殊技能,只能在本类中进行扩展 子类中独有方法如何实现 实现了子类中独有方法,那子类有独有的属性呢?我养了一个小泰迪,我给他起个名字,但是鸟就没有这个属性 class Animal

面向对象:封装继承和多态、接口

1.多态 定义:不同对象对于同一个方法(Cut)调用表现出不同行为多态性主要是靠重写和隐藏来实现 a.(父类引用指向子类对象)b.(父类类型做参数,传递子类对象)自定义方法参数是父类类型 传递的实参是子类对象c.(父类类型作返回类型,return子类对象)自定义方法的返回类型是父类类型,return是类对象注:都是把子类对象赋给父类类型 举例: 添加乐器类using System;using System.Collections.Generic;using System.Linq;using S

继承,多态和接口。

继承:extends. 继承的优点:代码的可重用性.子类可以扩展父类的属性和方法.父类的属性和方法可用于子类. 使用“is,a”关系判断继承. 父类: public class Pet{ private String name; //名字 private int health; //健康值 private int close; //亲密值 子类: public class Dog extends Pet{ private String breed; // 品种 方法重写: 子类方法对父类方法的重

Java中的继承和多态

1.  什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类更具体.父类具有更一般的特征和行为,而子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为. 在继承关系中.父类和子类需要满足is-a的关系.子类是父类. 表示父类和子类的术语:父类和子类.超类和子类.基类和派生类,他们表示的是同一个意思. 2.  为什么需要继承?什么时候应该继承? 使用继承可以有效实现代码

Java继承、多态和接口

继承 含义:可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点: 1)代码的重用性 2)子类扩展父类的属性和方法 3)父类的属性和方法可用于子类 4)设计应用程序变得更加简单 继承的实现: 关键字extends:用于继承其他类(extends出现在类声明类名后,extends后接要继承的类名) 访问修饰符   class  子类名   extends 父类名(){}; 1 public class Employee (){} // 父类 2 public class Sal