C# 学习笔记(2)

字段和属性(Property) - 字段好理解,为何还要属性呢?这里说的属性不是用于反射的那个属性(Attribute)
      其实属性就类似于 vfp 中用 xxx_access 和 xxx_assign 定义的属性,主要是为了保护类成员的
      安全,通常是类有一个名为 fieldn 的私有字段,就提供一个 Fieldn 的属性来存取该字段,该属性的
      定义可能是: public <type> Fieldn { get{return fieldn;} set{fieldn = value;}}
      当然在 get;set 中还可以做更多的检查和限制性工作,如果没有更多的工作要做,可以简写为:
      public <type> Fieldn {get; set;},也可以在 IDE 中用“重构”来简单的将字段转为属性
overload - 重载,方法名相同但签名(参数个数|类型|顺序,返回类型)不同,多态的一种表现形式
override - 重写(覆盖),名称和签名完全相同,对基类中用 virtual 声明方法的重新编码
new       - 隐藏,名称和签名完全相同,基类成员无 virtual 限定词,派生类需用关键字 new 来显式说明
   在重写和隐藏成员中,都可以通过使用 base.Method() 调用继承的方法
   vfp 的所有类方法都是虚拟的,在派生类中写的代码都属于重写,调用继承的方法使用 dodefault()
问题:base 指的是哪个基类,如果是父类,子孙类能绕过父类直接调用祖父、曾祖父的方法吗?
   vfp 可以用 :: 限定符直接调用,C#呢?
重写和隐藏的区别:
  重写导致一个新版本的产生,类实例只会使用这个新版本,不管是通过派生类还是基类来引用
  隐藏可以认为是生成一个完全不同的新方法,根据类型是派生类还是基类的不同引用会调用不同的方法
sealed -   密封(与 abstract 相反),代表一个类或方法不能被派生类继承,C# 的 String 类就是这样一个类

Abstract(抽象)类和 Interface(接口)的选择
它们拥有太多相似的功能,它们都可以包含可由派生类继承的成员,都不能被实例化,...
区别也很明显:
派生类只能继承自一个基类,也就只能直接继承自一个抽象类(当然在继承链上可以有多个抽象类),但却可以同时继承多个接口
接口比抽象类有更多的限制,它们不能拥有字段成员,不能有构造/析构函数,也不能包含静态成员,它们的方法都是抽象的(虽然不能用 abstract 关键字),这些方法都必须在使用它的类中得到实现,它们的成员都是 public 型的
抽象类却自由得多,它的成员可以是抽象的,也可以是非抽象的,可以公用的,也可以是私有的,内部的或受保护的,它们的方法中可以包含实现代码,也可以是等待派生类来实现的抽象方法

如何决定何时该使用抽象类,何时使用接口,或者说,哪些该放入抽象类,哪些该放入接口呢?一般性的原则是:拥有相同实现方法的东西应该放入抽象类;而虽共同拥有,却有不同目的或实现方式的东西应该放入接口中。
例如:“交通工具”这个抽象类可以派生出“汽车”和“轮船”两个抽象类,汽车类可以派生出“大巴”和“卡车”两个非抽象类,轮船也可派生出“客轮”和“油轮”两个非抽象类,而“运送乘客”和“运送货物”可以作为两个接口,“大巴”和“客轮”继承了“运送乘客”这个接口,而“卡车”和“油轮”继承了“运送货物”这个接口。

今天不会再提交失败了吧?!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值