zoukankan      html  css  js  c++  java
  • C#学习笔记4

    1.C#只支持单一继承,若想要实现多重继承的效果。有2种方式:

    第一种为传递继承,A为基类,B继承A,C继承B,通过传递来增迭要包含的元素,但这种继承的设计,在业务上具有明显的从属关系。

    第二种为聚合,在关联关系中,如果定义了包容对象的一个核心组件,就会发生聚合。对于多重继承,这涉及挑选一个类作为主要基类(PdaItem),然后从中派生出个新类 (Contact),第二个希望的基类(Person)作为派生类(Contact)中的一个字段添加。接着字段 (Person) 上的所有非私有成员都在派生类(Contact) 上重新定义。然后,派生类 (Contact) 将调用委托给字段 (Person)。由于方法要重新声明,所以一些代码会重复,但是重复的代码不会根多,因为实际的方法主体只在聚合类 (Person)中实现。

    2.不要在构造器中调用会影响所构造对象的任何虚方法,因为假如这个虚方法在当前要实例化的类型的派生类型中进行重写,就会调用重写的实现。但在继承层次结构中,基类正在构造而派生类还没构造。所以,调用虚方法将导致无法预测的行为。

    3.new修饰符:new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员时,该成员的派生版本将替换基类版本。虽然可以在不使用 new 修饰符的情况下隐藏成员,但会生成警告。如果使用 new 显式隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。

    4.sealed修饰符:除了可以修饰类(密封类,不能派生),virtual成员也可以密封,如A类有个虚方法Say(),B类继承后重写Say(),B类为了不让后面的派生类重写Say(),可以使用sealed修饰。

    5.is运算符:不仅仅是检查数据是否能够转换到目标类型,且还会检查对象本身类型是否真的是目标类型。因此能够强制转换的对象,不一定是目标类型。如Thing类代码。

    public class Thing
    {
        public static explicit operator string(Thing thing)
        {
            return thing.ToString();
        }
    
        public override string ToString()
        {
            return "Thing";
        }
    
        public static void Test()
        {
            string s = "text";
            Thing t = new Thing();
            object o = t;
            Trace.Assert(!(t is string));
            Trace.Assert((string)t == "Thing");
            o = s;
            Trace.Assert((string)o == "text");
            Trace.Assert(o is string);
            Console.WriteLine("Ok");
        }
    }
    
    public class PdaItem
    {
        public DateTime CreateTime { get; set; }
        public DateTime ModifyTime { get; set; }
        public string Name { get; set; }
        protected string ObjectKey { get; set; } 
    }
    
    public class Contact : PdaItem
    {
        private Person internalPerson;//Person类的详细代码,在上一章已列出
        public string Address { get; set; }
        public string Phone { get; set; }
    
        public string FirstName
        {
            get { return internalPerson.FirstName; }
            set { internalPerson.FirstName = value; }
        }
    
        public string LastName
        {
            get { return internalPerson.LastName; }
            set { internalPerson.LastName = value; }
        }
    }

    ---------------------以上内容根据《C#本质论 第三版》进行整理

  • 相关阅读:
    Performance and Design
    返回数组中不重复的元素
    IE的button元素bug
    (转)Google Closure: 糟糕的JavaScript
    Why do we have an IMG element?
    About this and that
    C#中的Attribute
    C#检查字体是否存储,以及安装
    ZipFile压缩文件后,解压文件后有多层目录的处理方法
    Office系列在线预览
  • 原文地址:https://www.cnblogs.com/zwt-blog/p/6297380.html
Copyright © 2011-2022 走看看