(c)构造函数不继承,派生类会自动调用基类构造函数。
(d)基类可以定义虚方法、虚属性,它的派生类能够重载这些成员,展示出动态性。
(e)派生类只能单继承,但具有传递性,即ClassB 派生出 ClassC,ClassA 派生出 ClassB,则 ClassC 会继承 ClassB 和 ClassA 中声明的成员。
(f)C#可以把类和方法声明为sealed,对于类来说,这表示不能继承该类;对于方法来说,这表示不能重写该方法。
继承里的构造函数
(a)派生类构造函数自动调用基类的不带参数的构造函数
public class B: A
{
public B()
{
}
}
相当于public class B: A
{
public B():base()
{
}
}
(b)基类中带参数的构造函数必须显式调用,如果基类定义了带有参数的构造函数,那么此构造函数必须被执行,且在派生类中实现该构造函数,此时我们可以使用base关键字
public class A
{
public A(string str)
{
}
}
public class B:A
{
public B():base("aaa")
{
}
}
示例1:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JiChen
{
public class ParentClass
{
public ParentClass()
{
Console.WriteLine("父类构造函数。");
}
public void print()
{
Console.WriteLine("I'm a Parent Class。");
}
}
public class ChildClass : ParentClass
{
public ChildClass()
{
Console.WriteLine("子类构造函数。");
}
public static void Main()
{
ChildClass child = new ChildClass();
child.print();
Console.ReadKey();
}
}
}
示例2:
class A
{
int test=0;
public A(int i)
{
test = i;
Console.WriteLine("I am A 公有有参构造函数 ,test={0}", test);
}
}
class B : A
{
public B(int j):base(j) //派生类调用基类的方法:先调用基类构造函数
{
Console.WriteLine("I am B 公有有参构造函数,j={0}",j);
}
}
class InheritanceTest1
{
static void Main(string[] args)
{
B b = new B(1);
Console.Read();
}
} 示例3:
using System ;
public class Parent
{
string parentString;
public Parent( )
{ Console.WriteLine("Parent Constructor.") ;
}
public Parent(string myString)
{
parentString = myString;
Console.WriteLine(parentString) ;
}
public void print( )
{
Console.WriteLine("I'm a Parent Class.") ;
}
}
public class Child : Parent
{
//分号":"和关键字base用来调用带有相应参数的基类的构造函数。
public Child( ) : base("From Derived")
{ Console.WriteLine("Child Constructor.") ; }
//Child的print( )方法覆盖了Parent中的 print 方法。
public void print( )
{
base.print( ) ;
Console.WriteLine("I'm a Child Class.") ;
}
public static void Main( )
{
Child child = new Child( ) ;
child.print( ) ;
//显式类型转换,可以在派生类中进行数据类型的转换,使其成为基类的一个实例
((Parent)child).print( ) ;
Console.ReadKey();
}
}
sealed 修饰符
C#提供了一个sealed 修饰符,此修饰符会阻止其他类从该类继承。
sealed class A
示例:
{
int test;
public void Sum(int i,int j)
{
int sum = i + j;
Console.WriteLine("I am A ,my sum ={0}",sum);
}
}
class B : A
{
public void Minus(int i,int j)
{
int minus = i - j;
Console.WriteLine("I am B ,my minus ={0}", minus);
this.Sum(3, 4); //编译器会报错
}
}