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();
}
}
结果
派生类
基类