对象标识

在之前的博文中,提到两个群集类——ArrayList和Hashtable时,我们知道,当从群集中得到一个对象引用,需要把这个对象引用转换为合适的引用类型。有人可能会因此认为,对象不知为何会“忘记”自己属于哪个类,这是错误的认识。对象将始终记住它的类标识;当我们用不同类型的引用变量来指向对象时,这会帮助编译器判断对象是否可以回应特定的消息。让我们用下面例子来帮助理解这一点。

Professor也是Person和Object,三位一体

如果实例化一个Professor 对象,则它同时也是一个Person类型对象和一个Object类型对象,Professor对象在内存中的样子,可以想象成如图所示:

 

我们创建不同类型(即该对象派生链上得任意类型)的引用变量,来储存Object/Person/Professor对象的句柄,每个引用变量指向该对象的不同“表象”:

//创建一个Professor对象,为它的三种类型维护三个句柄

Professor pr = new Professor();

Person p = pr;

object o = pr;

如果用对象引用o指向Professor对象,则在编译器看来,仅存在“核心”对象;该对象的Person扩展和Professor扩展都不可理解(见下图)。所以,编译器会拒绝用o来访问Professor或Person中定义的特征:

//编译器会拒绝用o来访问Professor类定义的AddAdvisee()方法。

//因为即使我们知道该引用实际上指向另一个Professor对象,但它的句柄却被保存为一个object对象,所以编译器不能调用Professor类的所有方法。

o.AddAdisee(); //编译错误

//然而,我们可以调用Professor类从Object类继承下来的方法。

o.ToString();

如果改用Professor类的Person引用P,则编译器只承认“核心”对象及其Person“扩展”的存在;“Professor层”不被认可:

//编译器会拒绝用p来访问Professor类中定义的AddAdvisee()方法。因为即使我们知道这个引用实际上指向一个Professor对象,但它的句柄被存为一个Person对象,

//所以编译器不能调用Professor类所特有的方法。

p.AddAdvisee();//编译错误

//然而,我们可以调用Professor类从Object类继承下来的方法...

p.ToString();

//...或者Person类

p.Name;

只有通过Professor的句柄pr指向对象,编译器才允许我们访问Professor独有的特征。

 

 进一步举例:

    /// <summary>
    /// 參數編輯器數組
    /// </summary> 
    [Serializable]
    public class RepairControlItemEditCollection : List<RepairControlItemEdit>, IList,
        IList<RepairControlItemEdit>, IEnumerable<RepairControlItemEdit>, IEnumerable
    {
        public RepairControlItemEditCollection()
        {

        }

        /// <summary>
        /// 添加項目屬性
        /// </summary>
        /// <param name="sortOrder"></param>
        /// <param name="caption"></param>
        /// <param name="controlAddonName"></param>
        /// <param name="controlItemType"></param>
        /// <param name="controlItemName"></param>
        /// <param name="controlItemCreator"></param>
        public void Add(decimal sortOrder, decimal pcbControlItemOrder, 
            string caption, string controlAddonName,
            string controlItemType, string controlItemName,
            ControlItemCreatorBase controlItemCreator, bool pcHave, bool pcbHave,
            bool pcMandatory, bool pcbMandatory, bool enabled, string sql,
            string displayMember, string valueMember, string editMember, bool topStatistics)
        {
            RepairControlItemEdit controlItem = new RepairControlItemEdit()
            {
                SortOrder = sortOrder,
                PCBControlItemOrder = pcbControlItemOrder,
                Caption = caption,
                ControlAddonName = controlAddonName,
                ControlItemType = controlItemType,
                ControlItemName = controlItemName,
                ControlItemCreator = controlItemCreator,
                PCHave = pcHave,
                PCBHave = pcbHave,
                PCMandatory = pcMandatory,
                PCBMandatory = pcbMandatory,
                Enabled = enabled,
                SQL = sql,
                DisplayMember = displayMember,
                ValueMember = valueMember,
                EditMemeber = editMember,
                TopStatistics = topStatistics
            };
            Add(controlItem);   
        }

        public override string ToString()
        {
            return String.Format(Properties.Resource.Msg_ParameterEditCollection, this.Count);
        }
    }


 RepairControlItemEditCollection 类继承List<RepairControlItemEdit> 和实现了IList, IList<RepairControlItemEdit>, IEnumerable<RepairControlItemEdit>, IEnumerable,

那就说明RepairControlItemEditCollection 类继承了泛型父类的List<RepairControlItemEdit> 的所有大部分行为和属性,包括public void Add(T item);方法,使用可以直接使用

 Add(controlItem); 另外此类还自定义了一个Add方法,这个方法传入很多参数,为RepairControlItemEdit 的属性赋值。所以说RepairControlItemEditCollection这各类其实有两个Add方法(一个是继承父类的,一个是自己定义的),只是参数不同而。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值