VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • C#教程之C#学习笔记5

1.接口的显式实现:显式实现需要在实现接口的类型中,在实现接口的成员中添加接口名称的前缀。且没有必要添加public、virtual这些修饰符,因为显式实现只能通过接口调用,不能用实现类进行调用。为此最典型的做法就是将对象转型为接口。

2.接口的隐式实现:隐式实现即是正常现实,不需要在实现成员中添加接口名称前缀,且实现成员都是public修饰。隐式实现的成员即可在实现类中进行外部调用,也可用接口进行调用。

3.显示接口实现与隐式接口实现的比较:隐式和显式成员接口实现的关键区别显然并不在于方法声明,而是在于从类外部的可访问性。构建一个类层次结构时,有必要建模真实世界的“属于”关系一一例如,长颈鹿“属于”哺乳动物,这些是“语义”关系,接口经常用于建模机制关系。显式接口实现是将“机制方面的考虑”与“模型方面的考虑”分隔开的一种技术,要求调用者先将对象转换为接口(如IComparable),然后才能认为对象是“可比较”的。一般来说,最好的做法是将一个类的公共层面限制成“全模型”(即使用隐式接口实现),尽量少地涉及无关的机制。

4.如何选择接口的显示实现与隐式实现,可通过3个方面的考虑。

①成员是不是核心的类功能,若不是可以考虑显式实现;

②接口成员名作为类成员是否恰当,假如一个成员的用途在实现类中不是很明确,就考虑使用一个显式的实现;

③是否已经有一个同名的类成员,假如类已经有一个方法实现,那么只要是一个显式的接口成员,它就可以与那个方法同名;

5.接口的继承:在实现继承的接口中,用于显式接口成员实现的一个完全限定的接口成员名称中,必须引用最初声明它的那个接口的名昨。是提供多个接口,还是单独提供一个复合接口,这个决策在很大程度上依赖于接口设计者对于类的实理有什么要求。

6.通过接口来实现多重继承:虽然类只能从一个基类派生,但可以实现多个接口,因此可以像上一章那样使用聚合来处理多重继承。可以查看Contact2、Person2的代码,与上一章的区别在于前者是通过类来处理,后者通过接口来规定签名。IPerson 确保 Person2 的成员和复制到 Contact2 的成员具有一致的签名,然而这个实现仍然没有做到与“多重继承”真正同义,因为添加到 Person2 的新成并不会同时添加到 Contact2上。如果被实现的成员是方法(不是属性 ),那么有一个办法可以对此进行改进,具体地说,就是为从第二个基类(接口)“派生”的附加功能定义接口扩展方法。(当然在具有相同签名的情况下,任何实例方法都优先于扩展方法)

复制代码
public class PdaItem
{
    public DateTime CreateTime { get; set; }
    public DateTime ModifyTime { get; set; }
    public string Name { get; set; }
    protected string ObjectKey { get; set; } 
}

public interface IPerson
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

public class Person2 : IPerson
{
    public string FirstName
    {
        get { throw new NotImplementedException(); }

        set { throw new NotImplementedException(); }
    }

    public string LastName
    {
        get { throw new NotImplementedException(); }

        set { throw new NotImplementedException(); }
    }
}

public class Contact2 : PdaItem, IPerson
{
    private Person2 person2;

    public string FirstName
    {
        get { return person2.FirstName; }

        set { person2.FirstName = value; }
    }

    public string LastName
    {
        get { return person2.LastName; }

        set { person2.LastName = value; }
    }
}


相关教程