在学习中,有些概念在脑子里还不够清晰,请大家来讨论,指教!

解决方案 »

  1.   

    http://www.codeproject.com/csharp/JmAbstractClasses.asp
      

  2.   


    物体->工具->交通工具->汽车->小汽车->红旗车->黑色红旗车
      

  3.   

    抽象类和接口在语法和设计原则上的区别
    1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类
       接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做”抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中
    2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法; 
    3.一个类一次可以实现若干个接口,但是只能扩展一个父类 
    4.接口可以用于支持回调,而继承并不具备这个特点. 
    5.抽象类不能被密封。
    6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非  虚的,当然您也可以声明为虚的。 (C#)
    7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。
    8抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。
    9 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
    10 尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知.(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如asp.net中,Page类,有Server    Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。
    11 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
    如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。 
    如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
    这个只是我学习C#一月以来自己的一点学习心得,希望与csdn上各位朋友多指教!具体可看我的博客http://blog.csdn.net/xxqq0824/
      

  4.   

    关键是理解
    汽车是个抽象的东西,而奇瑞QQ汽车就不是抽象的东西。
    同理:
    数据库连接字符串是个抽象的东西,而oracle数据库连接字符串就不是个抽象的东西了.而抽象类就是把这些所有的抽象的方法、属性等集合在一起的类
    比如数据库操作抽象类,包括数据库连接,数据库保存,数据库关闭等方法。 
      

  5.   

    1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类
       接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做”抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中老兄,我用.net,我怎么没见接口都是带able字段,微软的接口都是用I开头,sun的java才是带able字段
      

  6.   

    从面向对象设计的角度来看,抽象类是为外界提供公共接口的一种方式,这一点上很像接口。但是抽象类可以给予某些基础实现,实现比接口更加自由的代码复用。在实现某些系统需要考虑设计模式时,抽象类可以更好地担任起“守门人”角色,即参数类型为抽象类,而实际传递的参数则是该类的子类甚至是子类的子类等等,在装饰模式、工厂模式、桥模式以及适配器模式等等均有应用,在这方面有着比接口更灵活的应用。更正楼上的一个观点“抽象类是不能密封的”,在.NET Framework2.0中,“抽象的密封类”实际上就是静态类,它不提供类的实例,且不能被继承,主要用于封装常用功能和方法。如类库中的System.Math、System.Convert等。
      

  7.   

    你先不看软件工程中的概念。
    抽象的东西,之所以叫抽象,本来就是看不见,摸不着的。只是一个概念。
    如上面有人提到的,“动物”,动物这个词就是抽象的,动物是什么样的?你见过吗?
    你说你家门口有一只狗,动物园有狮子,都是动物。你说的很对,他们的确是动物,但是他们都是具体的动物。你可以说狗是动物,但不能说动物是狗。对吧在程序中,如果动物是一个类。因为现实中动物是一个抽象的概念,它不是具体的,存在的东西
    所以应该声明为抽象类。所以抽象类不能被实例化。
    public abstract Animal
    {
    }
    而动物一般都能叫,就是有发出声音这个行为(当然也有的动物不能叫,先不考虑那么多了)。而动物的叫声是什么样的?我不知道,你说狗是“汪汪”,猫是“瞄瞄”,对,但那又是具体动物的叫声了。所以动物的叫声也是抽象的。
    那么就应该在动物类中添加一个抽象的方法
    public abstract Animal
    {
       public abstract void MakeSound();
    }狗,猫,他们是存在的,大街小巷到处可见。所以可以声明为具体的类。
    同时他们是动物的一种。所以可以继承于动物类。
    public class Dog : Animal
    {
       public override void MakeSound()
       {
          Console.WriteLine("汪汪");   }
    }
    public class Cat : Animal
    {
       public override void MakeSound()
       {
          Console.WriteLine("瞄瞄");   }
    }运行:
         // 我要动物,
         Animal animal;
        // 不行呀,动物是一个概念不能给你,那我要狗吧
        animal = new Dog();
        // 让它叫
        animal.MakeSound();
        
        // 换个猫叫声
        animal = new Cat();
        animal.MakeSound();就是实现了简单的多态。当然现实开发中是肯定不是这么简单的应用的。只是让你有点感觉。
      

  8.   


    基类和抽象类不是一个概念,A只要继承一个类B,那么B就是基类了。你不能这样理解抽象类,就是以abstract修饰的类来判断抽象类.应该从概念上,就像动物,因为它是抽象的概念,所以没有具体的行为,动物的行为都是抽象的,叫呀,跑呀。真正具体的动物狗呀,猫呀才有这些行为。
    所以将现实的概念应用到程序中,那么动物就应该声明为抽象类,并且不能被实例化,就是创建具体的对象,说白了就是不能 new ;那么为了体现这个概念,和约束它不能被 new ;就要在前面加上abstract关键字了(当然还有"Singleton"模式), 所以abstract关键字是为了这个目的而起的辅助作用。开发中的应用,是要看具体情况的,上面的弟兄都在解释在,面向对象,软件工程中的应用嘛
      

  9.   

    抽象类不能实例化,抽象方法也没有执行代码,必须在非抽象方法中Override,如果一个方法中他包括抽象函数,该类一定也是抽象的,也必须申明为抽象,
    抽象函数是虚拟的但是不能提供Virtual关键字,因为.NET Framework已经默认的给它加上了一个Virtual在加一个肯定出错.它和interface有很大的相似之处,不同之处在与抽象类里面可以定义字段,因为它毕竟还是类,所以可以定义字段,但接口只能定义,方法,属性,索引器,和事件