VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之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#本质论 第三版》进行整理


相关教程