精华内容
下载资源
问答
  • 一、 接口和抽象的区别? 相同点:不能被实例化,可以包含任意个抽象成员 不同点:抽象类是类,具有类的特点,只能单基类继承,多接口实现,而接口不是类,可以继承多个接口,抽象类中可以包含已经实现的非抽象...

    一、 接口和抽象类的区别?
    相同点:不能被实例化,可以包含任意个抽象成员
    不同点:抽象类是类,具有类的特点,只能单基类继承,多接口实现,而接口不是类,可以继承多个接口,抽象类中可以包含已经实现的非抽象成员,而接口中所有成员都是抽象的,没有实现的。
    二、什么是依赖注入?
    依赖注入(DI)和控制反转(IOC)是同一个概念。具体含义是:当某个角色需要另一个角色的协助时,在一般的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一(控制反转还有一种常见的实现方式称为依赖查找)
    三、存储过程和函数的区别
    函数:只能返回一个变量的限制。而存储过程可以返回多个。
    函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行,执行的本质都一样。
    函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少

    1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
    2. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。
    3. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句 中位于FROM关键字的后面。
    4. 当存储过程和函数被执行的时候,SQL Manager会到PRocedure cache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行。3、解法对比及优缺点 一般解法:简单描述存储过程和函数写法上的区别。通用解法:把存储过程和函数的主要区别阐述详细,主要的优缺点分析完毕,再推荐使用存储过程,详细说明使用存储过程的好处。4、延伸及扩展问题回答参考 1系统存储过程以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。2本地存储过程用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。3临时存储过程分为两种存储过程:一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。4远程存储过程在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。5扩展存储过程扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。存储过程可以有多个in,out,inout参数,而存储函数只有输入参数类型,而不能带 输入类型存储过程实现的功能要复杂一些;而存储函数的单一功能性(针对性)更强。存储过程可以返回多个值;存储函数只能有一个返回值。存储过程一般独立的来执行;而存储函数可以作为其他sql语句的组成部分来出现。存储过程可以调用存储函数。但函数不能调用存储过程。5、项目中体现经验的点 电商平台,查看商品的详细页面,URL地址需要传送商品相关的参数,数据之间的相互传递和进行编辑都需要用到。
      四.Redis使用
      Redis目前支持5种数据类型,分别是:String(字符串)、List(列表)、Hash(字典)、Set(集合)、Sorted Set(有序集合)String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字。Redis列表是简单的字符串列表,简单的说就是一个链表或者说是一个队列。Redis Hash对应Value内部实际就是一个HashMap。Redis set对外提供的功能与list类似是一个列表的功能。Redis有序集合类似Redis集合,不同的是增加了一个功能,即集合是有序的。2、大牛解法 (1)快照(snapshots)
        缺省情况情况下,Redis把数据快照存放在磁盘上的二进制文件中,文件名为dump.rdb。你可以配置Redis的持久化策略,例如数据集中每N秒钟有超过M次更新,就将数据写入磁盘;或者你可以手工调用命令SAVE或BGSAVE。
        工作原理
        . Redis forks.
        . 子进程开始将数据写到临时RDB文件中。
        . 当子进程完成写RDB文件,用新文件替换老文件。
        . 这种方式可以使Redis使用copy-on-write技术。
      (2)AOF
        快照模式并不十分健壮,当系统停止,或者无意中Redis被kill掉,最后写入Redis的数据就会丢失。这对某些应用也许不是大问题,但对于要求高可靠性的应用来说,
        Redis就不是一个合适的选择。
        Append-only文件模式是另一种选择。
        你可以在配置文件中打开AOF模式
      (3)虚拟内存方式
        当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.
        当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.
        vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.
    展开全文
  • 很多面试的时候经常问的问题,抽象接口的区别 具体的区别我也不是很清楚,我把我认为有道理的东西传授给你,希望能帮到你, 抽象接口区别不是很明显,除了多重继承外,感觉抽象类完全可以替代接口,个人...

    很多面试的时候经常问的问题,抽象类和接口的区别

    具体的区别我也不是很清楚,我把我认为有道理的东西传授给你,希望能帮到你,

    抽象类和接口区别不是很明显,除了多重继承外,感觉抽象类完全可以替代接口,个人感觉在于你要做什么用,抽象类为了代码复用性,接口为了实现多态性,你可以想一想你要用这两个的初衷是什么来决定

    不过抽象类如下:

    public abstract class Animal
    {
        public abstract string Name {get; set;}
    
        public abstract void Show();
    
        public void MakeVoice()
        {
            Console.WriteLine("hello, world!");
        }
    }

    接口如下:

    interface InterfaceStudent
    {
    
        void Method1();
    
        void Method2(int age);
    
        void Method3(string name, int age);
    }

    什么是虚函数,关键字还记得吗?virtual

    虚函数和抽象函数的区别,继承时虚函数不需要被实现,抽象方法必须被实现

    下面代码中不重写GetName也是对的,执行的是虚方法中的代码,重写之后实现的是重写之后的函数

    虚方法特点:

    虚方法前不允许有static,abstract,override 修饰符

    虚方法不能是私有的,因此不能用private

    虚方法(public virtual string GetName() )与 非虚方法(public string GetName())最大区别是:

    虚方法可以被派生类实现,非虚方法不能

    public class VirtualTest: VirtualSingle
        {
            //public override void GetName()
            //{
            //    //base.GetName();
            //    Console.WriteLine("my name is winner again");
            //}
    
            public override void GetAge()   ××××××××××× 
            {
                Console.WriteLine("method is unavailable. ×××××××××××");
            }
        }
    
        public class VirtualSingle
        {
            public virtual void GetName()
            {
                Console.WriteLine("my name is winner");
            }
    
            public void GetAge()
            {
                Console.WriteLine("my age is 18");
            }
        }
    
    
    
     VirtualTest vt = new VirtualTest();
     vt.GetName();

     

    展开全文
  • # 抽象基类(abstract base class.ABC): 抽象基类就是类里定义了纯虚成员函数的类 # 纯虚函数只是提供了接口,并没有具体实现,抽象基类不能被实例化(不能创建对象) # 通常是作为基类供子类继承,子类中重写虚函数,实现...

    抽象基类(abc模块)

    # 抽象基类(abc模块)
    # 抽象基类(abstract base class.ABC): 抽象基类就是类里定义了纯虚成员函数的类
    # 纯虚函数只是提供了接口,并没有具体实现,抽象基类不能被实例化(不能创建对象)
    # 通常是作为基类供子类继承,子类中重写虚函数,实现具体的接口。
    
    # 抽象基类就是定义各种方法而不做具体实现有类,任何继承自抽象基类
    
    # 应用场景
    # 1. 判断某个对象的类型
    # 2. 我们需要强制某个子类必须实现某些方法
    
    # 使用isinstance 和 type的区别
    
    class Demo(object):
        def __init__(self, names):
            self.names = names
    
        def __len__(self):  # Sized 有__len__方法 返回True
            return len(self.names)
    
        def __iter__(self):  # 查看原代码可以找到Iterable有__iter__方法 返回True
            pass
    
        def test(self):
            pass
    
    
    d = Demo(['ellen', 'python'])
    
    print(len(d))
    
    print(hasattr(d, 'test'))  # 判断是否有这个方法
    
    from collections.abc import Sized,Iterable
    
    print(isinstance('demo', int))  # 判断类型 判断实例
    print(isinstance(d,Sized))
    print(isinstance(d,Iterable))
    
    
    '''
    2. 我们需要强制某个子类必须实现某些方法
    web cache redis memcache 如果自己写了一个web框架要集成cache缓存,有redis缓存和memcache缓存
    这些缓存要自己去实现,还有一个缓存基类,也就是说这个类有一些方法必须在子类中才能实现,必须要继承才能实现
    
    '''
    import abc
    
    
    class CacheBase(metaclass=abc.ABCMeta):
       @abc.abstractmethod
        def get(self, key):
            #raise ValueError
            pass
    
       @abc.abstractmethod
        def set(self, key, value):
            # raise NotImplementedError
            pass
            # self.key = key
    
    class RedisBase(CacheBase):
        # 重写父类中的方法
        def get(self, key):
            pass
    
        def set(self,key,value):
            pass
    
    r = RedisBase()
    #r.get('ellen')
    

    使用isinstance 和 type的区别

    # 使用isinstance 和 type的区别
    
    # i = 1
    # s = 'ellen'
    
    
    # print(isinstance(1,int))
    # print(isinstance(s,int))
    # print(isinstance(s,str))
    
    # print(type(i))
    
    # if isinstance(i,int):    #  返回123
    # if type(i) == 'int':   # 不会打印
    # print(123)
    
    
    # class A:
    #     pass
    #
    # class B(A):
    #     pass
    
    # b = B()
    # print(isinstance(b,B))      # True
    # print(isinstance(b,A))      # True  考虑类的继承关系
    #
    # print(type(b) is B)          # True
    # print(type(b) is A)          # False 没有考虑类的继承关系
    # == value 是数值
    # is 是内存地址
    # 区别
    
    
    class A:
        # 类属性
        aa = 1
    
        # 实例方法
        def __init__(self, x, y):
            # 实例属性
            self.x = x
            self.y = y
           # self.aa = 22   # 在外部定义a.aa = 22 相当于在内部方法添加了实例属性
    
    a = A(1, 2)
    # print(a.x, a.y, a.aa)   # 可以向上查找
    
    # print(A.x)   # 报错  不能向下查找
    
    # print(A(1,2).x)  # 1 可以查找
    A.aa = 11
    a.aa = 22
    print(a.aa)   # 22
    print(A.aa)   # 11
    
    b = A(1,2)
    print(b.aa)     # 11
    

    super 函数

    # super 函数
    # 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时
    # 我们就需要调用父类的方法了,可能过使用super来实现
    class A:
        def __init__(self):
            print('A')
    
    
    class B(A):
        def __init__(self):
            print('B')
            super().__init__()
    
    # 重写了B的构造函数 为什么还要去调用super
    # super 执行顺序到底是什么样的?
    
    b = B()
    
    
    class People(object):
        def __init__(self,name,age,weight):
            self.name = name
            self.age = age
            self.weight = weight
    
        def speak(self):
            print('%s 说: 我%d岁了'%(self.name,self.age))
    
    class Student(People):
        def __init__(self,name,age,weight,grade):
           # super().__init__(name,age,weight)
            People.__init__(self,name,age,weight)
            self.grade =grade
    
    
    s = Student('ellen',18,90,3)
    s.speak()
    
    
    class A:
        def __init__(self):
            print('A')
    
    
    class B(A):
        def __init__(self):
            print('B')
            super().__init__()
    
    
    class C(A):
        def __init__(self):
            print('C')
            super().__init__()
    
    class E:
        pass
    
    class D(B,C,E):
        def __init__(self):
            print('D')
            super().__init__()
    
    
    d = D()
    print(D.__mro__)    # D B C A
    # super 调用父类中的方法
    # 而是按照mro 算法来调用的
    
    展开全文
  • 纯虚函数: 一个函数只有函数名形参列表,没有具体实现;语法:virtual double GetArea()=0; 抽象类: 在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。抽象类是不完整的,它只能用作基类。 含有纯虚...

    面试真题C++:1.什么是抽象类?什么是纯虚函数?纯虚函数跟一般的虚函数有什么区别?

    纯虚函数: 一个函数只有函数名和形参列表,没有具体实现;语法:virtual double GetArea()=0;
    抽象类: 在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象。抽象类是不完整的,它只能用作基类。

    1. 含有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。

    2. 定 义纯虚函数就是为了让基类不可实例化化,因为实例化这样的抽象数据结构本身并没有意义.或者给出实现也没有意义。定义纯虚函数的一般形式为:

    class 类名{
    virtual 返回值类型函数名(参数表)= 0; // 后面的"= 0"是必须的,否则,就成虚函数了
    };
    

    纯虚函数是一个在基类中说明的虚函数,它在基类中没有定义,要求任何派生类都定义自己的版本。纯虚函数为各派生类提供一个公共界面。从基类继承来的纯虚函数,在派生类中仍是虚函数。

    展开全文
  • 包含纯虚函数的类叫抽象类。 特点 不能实例化为对象,但是可以定义抽象类的指针引用。 可以定义一个抽象类的派生类,必须重写其所有纯虚函数,否则派生类还是抽象类。(注意重写与重载的区别) 用途 主要用途为做...
  • 包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。 2、虚函数声明如下:virtual ReturnType FunctionName(Parameter); 虚函数必须实现,如果不实现,编译器将报错,...
  • 虚函数有实现并且派生类可以选择是否重写该函数,...纯虚函数不提供函数的实现并且如果派生类要成为具体类则必须重写该纯虚函数,否则派生类仍然为抽象类。 转载于:https://www.cnblogs.com/ShowJoy/p/3633480.html...
  • 1.纯虚函数声明如下: virtual ReturnType ...类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象的具体指针或引用。 2.虚函数声明如下:virtual ReturnType FunctionName(Parameter); 虚函数必须
  • C++面向对象语言一大特性就是抽象,在程序设计上体现就是鼓励面向接口编程,而不要面向具体实现编程。这里所说的抽象和接口与C++多态性密切相关。C++多态分为静态多态(编译时多态)动态多态(运行时多态...
  • 2.抽象方法:其名为抽象,很好理解,其不能提供具体的实现,只是一个可重写(隐性)虚方法(可以理解为接口)模版。 3.这两个方法都是为了再次重写实现,所以都不能密封     C#重载:普通重载是...
  • 通过用户提供的具体参数,C++编译器在编译时刻能够将函数模板实例化,根据同一个模板创建出不同的具体函数,这些函数之间的不同之处主要在于函数内部一些数据类型的不同,而由模板创建的函数的使用方法与一般函数的...
  • 面向对象面向对象三大特性虚函数纯虚函数抽象类覆盖、隐藏 ...方法是可以实现具体功能的函数,比如输出年龄,或者另一个动物打一架。 #include<iostream> using namespace std; class animal{.
  • 1.纯虚函数声明如下: virtual ReturnType ...类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象的具体指针或引用。 2.虚函数声明如下:virtual ReturnType FunctionName(Parameter);
  • 函数、方法接口的区别

    千次阅读 2017-09-21 22:49:22
    函数是语句序列打包; 方法是对 对象成员操作,由函数实现; 接口是对方法的抽象和概括,有方法实现具体的接口; //之前是C开发,学习Go之后认识。
  • 接口和抽象的区别

    2019-06-03 15:33:00
    接口是什么: (1) 接口不能被实例化 (2) 接口只能包含方法声明 ...抽象类是从多个具体类中抽象出来父类,它具有更高层次的抽象。从多个具有相同特征类中抽象出一个抽象类,以这个抽象类作为其子类模板,从而...
  • 抽象接口的区别

    2018-08-22 08:48:00
    接口与抽象类中的抽象方法不能具体实现; 抽象类可以有构造函数抽象类中成员变量可以被不同修饰符来修饰; 2、接口: 接口中不能有普通数据成员,只能够有静态不能被修改数据成员,final表示全局...
  • /* 工厂模式是软件工程领域一种广为人知设计模式,这种模式抽象了创建具体对象 过程. **/ //下面首先来个简单易懂例子吧!注释很详细,不理解朋友一起来看看吧! //1.普通函数 function demo(){ //第一步...
  • 5、抽象类中可以包含具体的方法,而接口中不行 引申:接口中为什么不能含有构造函数? 1、构造器用于初始化成员变量,接口没有成员变量 2、类可以实现多个接口,若多个接口都有自己构造器,则不好决定构
  • 2、抽象类可以包含具体的方法,接口所有方法都是抽象的; 3、抽象类可以声明使用字段;接口则不能,但接口可以创静态final常量; 4、接口方法都是public抽象方法可以使public,private,protecte...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 579
精华内容 231
关键字:

具体函数和抽象函数的区别