C#中级教程-继承

实现继承:

表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数。
在实现继承中,派生类型采用基类型的每个函数的实现代码,除非在派生类型的定义中指定重写某个函数的实现代码。
在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承非常有用。

接口继承:

表示一个类型只继承了函数的签名,没有继承任何实现代码。 在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。

举例:
如果要声明派生自另一个类的一个类,就可以使用下面的语法:
class MyDerivedClass : MyBaseclass
{
// functions and data members here
}

多重继承:(接口)

一些语言(C++)支持所谓的 “多重继承”,即一个类派生自多个类。 使用多重继承的优点是有争议的:一方面,毫无疑问,可 以使用多重继承编写非常复杂、 但很紧凑的代码,。另一方面,使用多重实现继承的代码常常很难理解和调试。 如前所述,简化健壮代码的编写工作是开发 C#的重要设计 目标。 因此,C#不支持多重实现继承。
而 C#允许类型派生自多个接 口— — 多重接口继承。 这说明,C#类可以派生自另一个类和任意多个接口。更准确地说, System.Object 是一个公共的基类,所 以每个 C#(除了Object类之外)都有一个基类,还可以有任意多个基接口

举例:
如果类(或 结构)也 派生 自接 口,则用逗号分隔列表中的基类和接 口:
public class MyDerivedClass: MyBaseClass , IInterface1 , IInterface2
{
// etc.
}

和继承有关的方法

虚方法

把一个基类函数声明为virtual,就可以在任何派生类中重写该函数:
class MyBaseClass{
public virtual string VirtualMethod(){
return “Method is called in base class”;
}
}
在派生类中重写另外一个函数时,要使用override关键字显示声明
class MyDerivedClass:MyBaseClass{
public override string VirtualMethod(){
return “Method is called in derivedclass.”;
}
}
我们在子类里面重写虚函数之后,不管在哪里调用都是调用重写之后的方法

隐藏方法

如果签名相同的方法在基类和派生类中都进行了声明,但是该方法没有分别声明为virtual和override,派生类就会隐藏基类方法。(要使用new关键字进行声明)
基类
class MyBaseClass{
public int MyMethod(){
}
}
派生类(在派生类中把基类同名的方法隐藏掉了)
class MyDerivedClass :MyBaseClass{
public new void MyMethod() {
}
}
之后调用派生类的方法就会使用new字段的MyMethod,它所继承的基类的同名方法会被隐藏,从而不被调用

如果不使用new字段,子类与基类同名方法依然会按照使用了 new字段的情况,即会调用子类,默认使用了new(VS不会报错,会有提示)

在这里插入图片描述

this和base关键字
this可以访问当前类中定义的字段,属性和方法,有没有this都可以访问,有this可以让IDE-VS编译器给出提示,
this,当方法的参数跟字段重名的时候,使用this可以表明访问的是类中的字段,
base,可以调用父类中的公有方法和字段,有没有base都可以访问,但是加上base.IED工具会给出提示,把所有可以调用的字段和方法罗列出来方便选择

和继承有关的类

抽象类

C#允许把类和函数声明为 abstract。 抽象类不能实例化,抽象类可以包含普通函数和抽象函数,抽象函数就是只有函数定义没有函数体。 显然,抽象函数本身也是虚拟的Virtual(只有函数定义,没有函数体实现)。
类是一个模板,那么抽象类就是一个不完整的模板,我们不能使用不完整的模板去构造对象。
abstract class Building{
public abstract decimal CalculateHeatingCost();
}

密封类和密封方法

C#允许把类和方法声明为 sealed。
对于类 ,这表示不能继承该类;
对于方法表示不能重写该方法。
sealed FinalClass
{
// etc
}

派生类的构造函数

1,在子类中调用父类的默认构造函数(无参)(会先调用父类的,然后是子类的)
public class MyDerivedClass{
public MyDerivedClass():base(){
//do something
}
}
在这里 :base()可以直接不写,因为默认会调用父类中的默认构造函数
2,调用有参数的构造函数
public class MyDerivedClass{
public MyDerivedClass(string name):base(name){
//do something
}
}

修饰符

修饰符,用来描述类型或者成员的关键字。修饰符可以指定方法的可见性。
在这里插入图片描述

不使用修饰符,默认为private

static可以修饰字段或者方法,修饰字段的时候,表示这个字段是静态的数据,叫做静态字段或者静态属性,修饰方法的时候,叫做静态方法,或者静态函数
使用static修饰的成员,只能通过类名访问
当我们构造对象的时候,对象中只包含了普通的字段,不包含静态字段
static 表示该数据唯一,单例模式(只有一个)常见

接口

定义接口(飞翔功能)
public interface IFlyHandler{
public void Fly();
}
实现接口
public class Type1Enemy:IFlyHandler{
}
定义一个接口在语法上跟定义一个抽象类完全相同,但不允许提供接口中任何成员的实现方式,一般情况下,接口只能包含方法,属性,索引器和事件的声明。
接口不能有构造函数,也不能有字段,接口也不允许运算符重载。
接口定义中不允许声明成员的修饰符,接口成员都是公有的

派生的接口
接口可以彼此继承,其方式和类的继承方式相同
public interface A{
void Method1();
}
public interface B:A{
void Method2();
}

猜你喜欢

转载自blog.csdn.net/euphorias/article/details/104921884
今日推荐