• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

04月
12
C#

C#中派生类继承基类操作

发表于 2022-04-12 • 字数统计 3331 • 被 760 人看爆

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中,在赋值运算符的左边。
  • 其他部分的引用不能“看到”派生类对象的其余部分,因为它通过基类类型的引用“看”这个对象。
    基类的引用.png

实例

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();

    }
}

结果

派生类
基类

分享到:
虚方法与覆写方法
分部类和分部方法
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,091次看爆
  • JAVA_HOME环境配置问题 3,741次看爆
  • AssetBundle使用 3,509次看爆
  • VSCode配置C++开发环境 3,264次看爆
  • Lua反射 3,140次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图