C#基础知识—父类和子类的关系

简介: 基础知识一: using System; using System.Collections.Generic; using System.Linq; using System.Windows.

基础知识一:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public class ParentClass
    {
        public ParentClass()
        {

        }
        public string NamePropety { get; set; }

        public string GetName()
        {
            return "";
        }
    }

    public class ChildClass : ParentClass
    {
        public ChildClass()
        {

        }

        public int Age { get; set; }

        public int GetAge()
        {
            return 10;
        }
    }

    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //=>1、实例化父类
            ParentClass parent = new ParentClass();
            string _NamePropety = parent.NamePropety;
            string _name = parent.GetName();

            //1.1向上转型 子类转父类
            ParentClass parent1 = new ChildClass(); //或者ParentClass parent1 = new ChildClass() as ParentClass;
            string _NamePropety1 = parent1.NamePropety;
            string _name1 = parent1.GetName();


            //=>2、实例化子类
            ChildClass child = new ChildClass();
            string _NamePropety2 = child.NamePropety;
            string _name2 = child.GetName();
            int ageName2 = child.GetAge();
            int age2 = child.Age;


            //2.1向下转型 父类转换子类。
            ParentClass child3 = new ChildClass();
            ChildClass child4 = (ChildClass)child3;
            string _NamePropety3 = child4.NamePropety;
            string _name3 = child4.GetName();
            int ageName3 = child4.GetAge();
            int age3 = child4.Age;

            //=>3、不正确的父类转子类。

            //as方式转换。(as 转换失败时,程序不会抛异常,child1对象为NULL。)
            ChildClass child1 = new ParentClass() as ChildClass; //或者 ChildClass child1 = (ChildClass)new ParentClass();
            Console.WriteLine(child1.NamePropety);

            //强制转换。(程序会抛出异常。)
            ChildClass child1_1 = (ChildClass)new ParentClass();

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

      
    }
}
View Code

 

基础知识二:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using IBO.XJMYQP.ControlLib;

namespace IBO.XJMYQP.UI
{
    public class ParentClass
    {
        public ParentClass()
        {
            Console.WriteLine("初始化父类构造函数");
        }
        public virtual void Test1()
        {
            Console.WriteLine("我是基类的Test1");
        }
        public void Test2()
        {
            Console.WriteLine("我是基类的Test2");
        }
        public virtual void Test3()
        {
            Console.WriteLine("我是基类的Test3");
        }
        //=>//protected访问修饰符在大多数资料中的定义:访问仅限于包含类或从包含类派生的类型。包含类指的父类
        protected void Test4()
        {
 
        }
    }

    public class ChildClass : ParentClass
    {
        public ChildClass()
        {
            Console.WriteLine("初始化子类构造函数");
        }
        public override void Test1()
        {
            Console.WriteLine("我是子类的Test1");
        }

        public new void Test2()
        {
            Console.WriteLine("我是子类的Test2");
        }

        public new void Test3()
        {
            Console.WriteLine("我是子类的Test3");
        }
        
    }



    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Console.WriteLine("-------(1)、new ParentClass()用于调用的都是基类 Begin-----------");
            //=》调用的是基类。
            ParentClass b1 = new ParentClass();
            b1.Test1();
            ParentClass b2 = new ParentClass();
            b2.Test2();
            ParentClass b3 = new ParentClass();
            b3.Test3();
            Console.WriteLine("-------END-----------");


            Console.WriteLine("-------(2)、override关键字与父类的virtual 关键字 Begin-----------");

            //=>override 关键字,重写父类的方法。只要 new ChildClass()后,不管对象转化谁调用的都是子类重写方法。
            ParentClass p1 = new ChildClass();
            p1.Test1();
            ChildClass c1 = new ChildClass();
            c1.Test1();

            Console.WriteLine("-------END-----------");


            Console.WriteLine("-------(3)、new 关键字 Begin-----------");

            ParentClass p2 = new ChildClass();
            p2.Test2();
            ChildClass c2 = new ChildClass();
            c2.Test2();

            Console.WriteLine("-------END-----------");


            Console.WriteLine("-------(4)、new 关键字与父类的virtual Begin-----------");
          
            //=>new 关键字,就是独立子类与父类的相同方法,转化为谁后调用的就是谁。
            ParentClass p3 = new ChildClass();
            p3.Test3();
            ChildClass c3 = new ChildClass();
            c3.Test3();

            Console.WriteLine("-------END-----------");

            Console.ReadKey();


        }
    }
}

  输出:

      

-------(1)、new ParentClass()用于调用的都是基类 Begin-----------
初始化父类构造函数
我是基类的Test1
初始化父类构造函数
我是基类的Test2
初始化父类构造函数
我是基类的Test3
-------END-----------
-------(2)、override关键字与父类的virtual 关键字 Begin-----------
初始化父类构造函数
初始化子类构造函数
我是子类的Test1
初始化父类构造函数
初始化子类构造函数
我是子类的Test1
-------END-----------
-------(3)、new 关键字 Begin-----------
初始化父类构造函数
初始化子类构造函数
我是基类的Test2
初始化父类构造函数
初始化子类构造函数
我是子类的Test2
-------END-----------
-------(4)、new 关键字与父类的virtual Begin-----------
初始化父类构造函数
初始化子类构造函数
我是基类的Test3
初始化父类构造函数
初始化子类构造函数
我是子类的Test3
-------END-----------

  

 

目录
相关文章
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
1029 0
|
9月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
393 19
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
445 3
|
10月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
2189 0
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
1494 12
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
743 4
|
安全 程序员 编译器
C#一分钟浅谈:泛型编程基础
在现代软件开发中,泛型编程是一项关键技能,它使开发者能够编写类型安全且可重用的代码。C# 自 2.0 版本起支持泛型编程,本文将从基础概念入手,逐步深入探讨 C# 中的泛型,并通过具体实例帮助理解常见问题及其解决方法。泛型通过类型参数替代具体类型,提高了代码复用性和类型安全性,减少了运行时性能开销。文章详细介绍了如何定义泛型类和方法,并讨论了常见的易错点及解决方案,帮助读者更好地掌握这一技术。
383 11