zoukankan      html  css  js  c++  java
  • C#基类和派生类

    C#基类和派生类
    1.基类和派生类的一些基本概念
    class B : A{}
    A是基类,B是派生类.
    一个类最多只允许从一个类中派生.
    class C : B{}
    B还可以充当C的派生类
    继承总是隐式为public的,System.Object是所有类的根
    编译器会把你的类悄悄的编译成 class A : System.Object{}
    2.调用基类的构造函数        
    class B : A
    {
    public B(string sqlstr) : base(sqlstr)
    {}
    }
    3基类派生类对象之间的关系
    class A{}
    class B : A {}
    class C: A {}
    B b = new B();
    C c = b;  //这样写是错误地,因为类型不同
    A a = b; //这样写是正确的,但是一定要注意:
    这样做有一个明显的限制 a 对象只能访问基类中的成员不能访问派生类中的成员
    这就是为什么C#完全面向对象的原因,因为C#中所有的东西都继承自System.Object,任何东西都能赋给一个object变量
    4.方法的隐藏
    如果一个基类有n个方法和n个派生类,这n个派生类里又分别有n个方法.你想过会出现什么问题吗?对!就是会遇到完全一样签名的方法(方法名\参数的数量\类型完全一样)如果出现这样的情况,在编译过程中将收到一个警告,不要惊慌,仅仅是警告而已,不会影响编译的过程.

    但是你应该认真的对待这个警告,如果派生类的一个对象将调用基类的一个方法,然而这个方法又在这个派生类里有相同签名的方法!那编译器该怎么办?
    我可以负责任的告诉你(呵呵):
    对象调用的是派生类里的方法,
    这种现象在微软官方叫方法的隐藏,

    如果你不想看到那个警告,可以在派生类中与基类同签名的方法前面加个new关键字,告诉编译器:我会为我造成的结果负责,不要警告我!注意这个关键字只是起个屏蔽警告的作用,你明白我的意思吗?(派生类的对象照样还是不能调用基类中同签名的方法,呵呵,还是再补一句吧,)
    5.方法的覆盖
    先看个例子:

    class nvren
    ...{
    public virtual string leixing()
    ...{return "这是个女人";}
    }
    class meinv : nvren
    ...{
    public override string leixing()
    ...{return "这是个美女";}
    }
    class weizhi : nvren
    ...{
    ...............//这里并没有任何覆盖原方法的方法
    }
    nvren a = new nvren();
    meinv b = new meinv();
    weizhi c = new weizhi();
    Console.WriteLine(a.leixing());
    Console.WriteLine(b.leixing());
    Console.WriteLine(c.leixing());

    程序很简单(原谅我用了中文拼音,我知道你看了很多国外的程序,肯定腻了)
    当调用第三个WriteLine时,程序输出了"这是个女人",现在不用我解释你也该明白了.
    这种同一个语句调用不同方法的现象称为多态性(面向对象的一大特性啊!)
    使用virtul和override一定要注意:
    (1)两个方法必签名相同!
    (2)两个方法均不能是private方法,且必须有相同的可访问性!
    (3)不要试图override没有virtual的方法!
    (4)不要试图不用override就覆盖基类的virtual方法(那就成了方法的隐藏了)!

    在给你个小窍门:
    一个override方法将隐式的成为virtual方法,他本身可在未来的一个派生类里被覆盖(点到为止,不要让我写例子给你)

    这篇小文到次也该结束了,但我还想再提两句
    1.派生类可以访问一个基类的protected成员
    2.建议保持字段为private. ( 因为面向对象强调封装,而public破坏了封装性,private也会在某些时候破坏封装性,你应该知道是哪些时候.呵呵)
  • 相关阅读:
    Unity错误提示大全(遇到问题就更新)
    使用log4Net输出调试信息
    3.创建Manager类,演示对TestUser进行增删改查功能
    2.创建NHibernateHelper帮助类,生成sessionFactory
    1.使用FluentNHibemate 操作数据库,添加映射到数据库
    MySql介绍与安装
    搭建unity客户端
    搭建服务器端
    Photon介绍与安装
    简练软考知识点整理-实施定量风险分析
  • 原文地址:https://www.cnblogs.com/mokliu/p/2138946.html
Copyright © 2011-2022 走看看