Object类
除特殊的类Object,所有的类都是派生类,派生自object类
例
class SomeClass
{
    ....
}
//等价于
class SomeClass : object
{
    ....
}
类继承注意点
- 一个类声明的基类规格说明中只能有一个单独的类。这称为单继承。
 - 虽然类只能直接继承一个基类,但继承的层次没有限制。也就是说,作为基类的类可以派生自另外一个类,而这个类又派生自另外一个类,一直下去,直至最终到达object。
 
例
class SomeClass
{...}
class OtherClass: SomeClass
{...}
class MyNewClass: OtherClass
屏蔽基类成员
派生类不能删除它继承的任何成员,但可以用与基类成员名称相同的成员来屏蔽基类成员
规则
- 要屏蔽一个继承的数据成员,需要声明一个新的相同类型的成员,并使用相同的名称。
 - 通过在派生类中声明新的带有相同签名的函数成员,可以隐藏或屏蔽继承的函数成员请记住,签名由名称和参数列表组成,不包括返回类型。
 - 要让编译器知道你在故意屏蔽继承的成员,使用new修饰符。否则,程序可以成功编译,但编译器会警告你隐藏了一个继承的成员。
 - 也可以屏蔽静态成员
 
例
class SomeClass     //基类
{
    public string Field1;
    ....
}
class OtherClass: SomeClass     //派生类
{
    new public string Field1;       //用同样的名称屏蔽成员  相当于新开辟一个内存
}
实例
class SomeClass     //基类
{
    public string Field1 = "SomeClass Field1";
    public void Method1(string value)
    {
        Console.WriteLine($"SomeClass.Method1: {value}");
    }
}
class OtherClass:SomeClass      //派生类
{
    new public string Field1 = "OtherClass Field1"; //屏蔽基类成员
    new public void Method1(string value)
    {
        Console.WriteLine($"OtherClass.Method1:{value}");
    }
}
class Program
{
    static void Main(string[] args)
    {
        OtherClass oc = new OtherClass();       //使用屏蔽成员
        oc.Method1(oc.Field1);
        Console.ReadKey();
    }
}
结果
OtherClass.Method1:OtherClass Field1
基类访问
如果派生类必须完全地访问被隐藏的继承成员,可以使用基类访问表达式访问隐藏的继承成员。
基类访问表达式由关键字base后面跟着一个点和成员的名称组成
语法
Console.WriteLine($"{base.File1}");     //基类访问
实例
class SomeClass     //基类
{
    public string Field1 = "Field1 -- In the base class";
}
class OtherClass:SomeClass      //派生类
{
    new public string Field1 = "Field1 -- In the derived class"; //屏蔽基类成员
    new public void PrintField1()
    {
        Console.WriteLine($"OtherClass.Method1:{Field1}");     //访问派生类
        Console.WriteLine($"OtherClass.Method1:{base.Field1}");     //访问基类类
    }
}
class Program
{
    static void Main(string[] args)
    {
        OtherClass oc = new OtherClass();       //使用屏蔽成员
        oc.PrintField1();
        Console.ReadKey();
    }
}
结果
Field1 -- In the derived class
Field1 -- In the base class
基类的引用
使用类型转换运算符把该引用转换为基类类型
语法
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass) derived;
分析
第一行声明并初始化了变量derived,它包含一个MyDerivedClass类型对象的引用。
第二行声明了一个基类类型MyBaseClass的变量,并把derived中的引用转换为该类型,给出对象的基类部分的引用。
- 基类部分的引用被储存在变量mybc中,在赋值运算符的左边。
 - 其他部分的引用不能“看到”派生类对象的其余部分,因为它通过基类类型的引用“看”这个对象。
 
实例
class MyBaseClass
{
    public void Print()
    {
        Console.WriteLine("基类");
    }
}
class MyDerivedClass:MyBaseClass
{
    new public void Print()
    {
        Console.WriteLine("派生类");
    }
}
class Program
{
    static void Main(string[] args)
    {
        MyDerivedClass derived = new MyDerivedClass();
        MyBaseClass mybc = (MyBaseClass)derived;        //转换成基类
        derived.Print();        //从派生类部分调用Print
        mybc.Print();           //从基类部分调用Print
        Console.ReadKey();
    }
}
结果
派生类
基类
    