zoukankan      html  css  js  c++  java
  • 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; }
        }
    }

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

  • 相关阅读:
    LINQ 详解
    oracle下查询的sql已经超出IIS响应时间
    IOC应用之 Ninject
    JSONP ---------跨域
    国内各大互联网公司相关技术站点2.0版 (集合腾讯、阿里、百度、搜狐、新浪、360等共49个)
    IO多路复用,以socket为例
    socket机制下实现的多用户与服务器交互
    在一个进程中定义多个线程
    基于tcp的socketserver,即tcp的多线程
    基于upd的socketserver,即udp的多线程
  • 原文地址:https://www.cnblogs.com/zwt-blog/p/6297528.html
Copyright © 2011-2022 走看看