首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

什么时候接口的实现/扩展不应该返回比接口上声明的类型更具体的类型?

接口的实现/扩展不应该返回比接口上声明的类型更具体的类型的情况有以下几种:

  1. 遵循接口隔离原则:接口隔离原则要求接口的设计应该精简而专注于特定的功能。如果实现类返回比接口声明的类型更具体的类型,就可能暴露了不必要的细节,违反了接口隔离原则。
  2. 保持一致性:接口定义了一种契约,表示实现类必须提供特定的行为和功能。如果实现类返回比接口声明的类型更具体的类型,就会导致不同的实现类返回不一致的结果,破坏了代码的可预测性和可维护性。
  3. 降低耦合度:接口的目的是为了降低组件之间的耦合度,使得它们可以独立开发、测试和维护。如果实现类返回比接口声明的类型更具体的类型,就会增加组件之间的依赖关系,导致耦合度增加,降低了代码的灵活性和可扩展性。
  4. 提高代码的可复用性:接口的设计应该追求代码的可复用性,使得实现类可以在不同的上下文中重复使用。如果实现类返回比接口声明的类型更具体的类型,就会限制了代码的复用性,使得实现类只能在特定的上下文中使用。

综上所述,接口的实现/扩展不应该返回比接口上声明的类型更具体的类型,以遵循接口隔离原则、保持一致性、降低耦合度和提高代码的可复用性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Golang 函数返回类型接口返回对象指针还是值

1.接口简介 Interface 是一组抽象方法(未具体实现方法,仅包含方法名参数返回方法)集合,如果实现了 interface 中所有方法,即该类型实现了该接口。...注意: (1)接口中不能含有属性; (2)每种类型都能实现多个接口; (3)未初始化接口类型变量值为 nil。...接口声明格式: type InterfaceName interface { //方法列表 } 2.函数返回类型接口返回对象指针还是值 函数返回类型接口返回对象指针还是值,这个要看具体需要...createEmployeeObj() o.Set() o.Print() e.Print() } 输出结果: company=alibaba company=alibaba 可见函数返回类型接口返回对象指针...company="alibaba" e1.Print() } e.Print() } 输出结果: company=alibaba company=tencent 可见函数返回类型接口返回对象

7.9K30

【C++】异常处理 ④ ( 异常接口声明 | 异常接口语法 | 抛出一种类型异常 | 抛出多种类型异常 | 抛出任意类型异常 | 不能抛出异常 | 抛出异常类型错误 | 代码示例 )

中,即 在 函数中国年 列出所有可能抛出异常类型 ; 2、异常接口语法 在 C++ 语言中 , 异常接口 声明使用 throw() 关键字 , 用于指定函数要抛出异常类型 ; 异常接口语法如下...: 函数返回值 函数名(函数参数列表) throw (异常类型1, 异常类型2, ..., 异常类型n) 3、抛出一种类型异常 抛出一种类型异常 : 在 void fun() 函数中 , 可能会抛出...: 在 void fun() 函数中 , 可能会抛出多个类型异常 , 可以使用如下异常接口声明 , 多个异常类型之间使用逗号隔开 ; // 可能会抛出 int , char , double 类型异常.../ 声明 throw(…) 可抛出任何类型异常 函数 , 有如下两种声明方式 : 不声明异常接口 : 在 函数 中 , 如果 不声明 异常接口 , 默认可以抛出任何类型异常 ; // 1....throw(…) 异常接口 : 如果 函数 异常接口 声明为 throw(…) , 则可以抛出任意类型异常 ; // 在 函数 中 抛出任意类型异常 void fun() throw(...) {

43110

Java 中到底是应该用接口类型 还是实现类型去引用对象?

换而言之,如果存在适当接口类型,那么参数,返回值和字段都应该使用接口类型。 如果你养成使用接口类型习惯,你程序将更加灵活。 如果没有合适接口存在,则通过类来引用对象。...因为定义接口目的是让代码有更强扩展性、隐藏内部代码、解耦。...ClassB();//类类型引用变量A 去接收对象地址 什么时候接口类型不适合做引用呢,我们看下面这个例子: interface A { //接口A //接口方法声明必须是...当实现类存在自己方法时,使用实现类来声明变量。...翻译过来大概就是: 如果存在适当接口类型,那么参数,返回值和字段都应该使用接口类型。 如果你养成使用接口类型习惯,你程序将更加灵活。 如果没有合适接口存在,则通过类来引用对象是完全合适

1.6K30

C# 自定义类型通过实现IFormattable接口,来输出指定格式和语言文化字符串(例:DateTime)

/UInt16,Int32/Uint32,Int64/Uint64,Single,Double,Decimal和Datetime)都实现了这个接口,这些基类型调用ToString方法之后,返回都是字面值字符串形式...,此外FCL中还有一些类型实现了这个接口. 1、Guid,GuidToString代码如下所示: ?...Guid是实现IFormattable接口,具体实现如下: public unsafe string ToString(string format, IFormatProvider provider)...Enum也实现了IFormattable接口,具体实现如下: 查看源代码发现,EnumToString()方法并没有使用IFormatProvider参数,原因是因为,Enum和语言无关,一般用于内部编程使用...DateTime实现了IFormattable接口,所以它可以自定义地构造我们想要DateTime字符串,具体实现如下: 第一步: ?

1.1K30

Python设计模式(六大)

(子类父类) 子类可以实现父类抽象方法,但不能覆盖父类非抽象方法; 当子类方法重载父类方法时,子类方法输入参数要比父类方法输入参数更宽松;(格式等要求) 依赖倒置原则 (Dependence...要针对接口编程,而不是针对实现编程。尽量引用层次高抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型转换等,而不要用具体类来做这些事情。...Segregation Principle) 客户端不应该依赖它不需要接口,一个类对另一个类依赖应该建立在最小接口上。...当一个接口太大时,分割成一些细小接口,使用该接口客户端仅需知道与之相关方法即可。每一个接口应该承担一种相对独立角色,不干不该干的事,该干的事都要干。...(类似于单一职责) 接口隔离原则与单一职责原则审视角度是不相同,单一职责原则要求是类和接口职责单一,注重是职责,这是业务逻辑划分,而接口隔离原则要求接口方法尽量少。

62020

【Java设计模式系列】装饰器模式(Decorator Pattern)

角色 Component 接口: 抽象构件 定义了对象接口,可以给这些对象动态增加功能 ConcreteComponent 具体类: 具体构件 定义了具体构件对象,实现了 在抽象构件中声明方法...代码实例 窗口 接口 public interface Window { // 绘制窗口 public void draw(); // 返回窗口描述 public String getDescription...继承更灵活,也意味着继承更易出错,排查也困难,对于多次装饰对象,调试时寻找错误可能需要逐级排查,较为烦琐。 适用场景 在不影响其他对象情况下,以动态、透明方式给单个对象添加职责。...不能采用继承场景: 系统存在大量独立扩展,为支持每一种组合将产生大量子类,使得子类数目呈爆炸性增长 类定义不能继承(如final类) 扩展 一个装饰类接口必须与被装饰类接口保持相同,对于客户端来说无论是装饰之前对象还是装饰之后对象都可以一致对待...装饰模式可分为: 透明装饰模式 要求客户端完全针对抽象编程,装饰模式透明性要求客户端程序不应该声明具体构件类型具体装饰类型,而应该全部声明为抽象构件类型 半透明装饰模式 允许用户在客户端声明具体装饰者类型对象

32320

【Java设计模式系列】装饰器模式(Decorator Pattern)

角色 Component 接口: 抽象构件 定义了对象接口,可以给这些对象动态增加功能 ConcreteComponent 具体类: 具体构件 定义了具体构件对象,实现了 在抽象构件中声明方法...代码实例 窗口 接口 public interface Window { // 绘制窗口 public void draw(); // 返回窗口描述 public String getDescription...继承更灵活,也意味着继承更易出错,排查也困难,对于多次装饰对象,调试时寻找错误可能需要逐级排查,较为烦琐。 适用场景 在不影响其他对象情况下,以动态、透明方式给单个对象添加职责。...不能采用继承场景: 系统存在大量独立扩展,为支持每一种组合将产生大量子类,使得子类数目呈爆炸性增长 类定义不能继承(如final类) 扩展 一个装饰类接口必须与被装饰类接口保持相同,对于客户端来说无论是装饰之前对象还是装饰之后对象都可以一致对待...装饰模式可分为: 透明装饰模式 要求客户端完全针对抽象编程,装饰模式透明性要求客户端程序不应该声明具体构件类型具体装饰类型,而应该全部声明为抽象构件类型 半透明装饰模式 允许用户在客户端声明具体装饰者类型对象

29220

分享 Java 常见面试题及答案(下)

c)使用线程池 79)说出 5 条 IO 最佳实践(答案) IO 对 Java 应用性能非常重要。理想情况下,你不应该在你应用关键路径避免 IO 操作。...接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态默认方法,这种方法是具体。 104)Java 中,抽象类与接口之间有什么不同?...它定义了排序步骤,但是具体比较,可以使用 Comparable 或者其语言中类似东西,具体策略由你去配置。列出算法概要方法就是众所周知模板方法。 116)什么时候使用访问者模式?...菱形操作符()用于类型推断,不再需要在变量声明右边申明泛型,因此可以写出可读写更强、简洁代码。另一个值得一提特性是改善异常处理,如允许在同一个 catch 块中捕获多个异常。...重复注解,现在你可以将相同注解在同一类型使用多次。 133)Java 中,Maven 和 ANT 有什么区别?

1K20

深入理解设计模式六大原则

覆写或实现父类方法时输出结构可以被缩小 父类一个方法返回值是一个类型T,子类相同方法(重载或覆写)返回值为S,那么LSP就要求S必须小于或等于T。...在java中,抽象指的是接口或者抽象类,细节就是具体实现类,使用接口或者抽象类目的是制定好规范和契约,而不去涉及任何具体操作,把展现细节任务交给他们实现类去完成。...; 任何类都不应该具体类派生; 尽量不要覆写基类方法; 结合里氏替换原则使用:接口负责定义public属性和方法,并且声明与其他对象依赖关系,抽象类负责公共构造部分实现实现类准确实现业务逻辑...通俗讲:接口尽量细化,同时接口方法尽量少。 问题由来: 类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要方法。...因此接口或抽象类可以约束一组可能变化行为,并且能够实现扩展开放。

2.9K51

设计模式(三)——面向对象设计原则

可以为系统定义一个相对较为稳定抽象层,将不同实现行为放到具体实现层中完成。 03 里式替换原则 历史替换原则:所有引用基类地方必须能透明地使用其子类对象。...设计时应将父类设计为抽象类或者接口,子类继承父类并实现在父类中声明方法;运行时子类实例(对象)替换父类实例(对象),可以很方便地扩展系统功能。...依赖倒转原则要求再程序代码中传递参数时,或在关联关系中,尽量引用层次高出现层类,即使用接口或抽象类来声明变量类型、参数类型声明、方法返回类型声明,以及数据类型转换等,而不要使用具体类来做这些事情。...05 接口隔离原则 接口隔离原则:客户端不应该依赖那些它不需要接口。...当一个接口太大时,应该将它根据需要分割成多个细小接口,每个接口仅承担一个相对独立角色或功能,使用该接口客户端仅需知道与之相关方法即可。 但是,接口不能过小,否则系统中接口太多,不利于维护。

54120

程序员修仙之路——设计模式六大基本原则

系统中进行设计和实现时候应当使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型说明,以及数据类型转换等,而不要用具体类进行上述操作。...要保证做到这一点, 一个具体类应当只实现接口和抽象类中声明方法,而不要给出多余方法。传统过程性系统设计办法倾向于使高层次模块依赖于低层次模块,抽象层次依赖于具体层次。...尽量做到:任何变量都不应该持有-个指向具体指针或者引用;任何类都不应该具体类派生;任何方法都不应该覆写它任何基类中己经实现方法。...根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些细小接口,使用该接口客户端仅需知道与之相关方法即可。每一个接口应该承担一种相对独立角色,不干不该干的事,该干的事都要干。...这里接口”往往有两种不同含义:一种是指一个类型所具有的方法特征集合,仅仅是一种逻辑抽象;另外一种是指某种语言具体接口”定义,有严格定义和结构, 五、迪米特法则 迪米特原则定义:迪米特法则

28120

PHP核心技术与最佳实践(一)

PHP接口实现属于多态。 8.区别是否多态关键在于看对象是否是同一类型。多态本质就是if...else,只不过实现层级不同。...当然这并不是说一个类如果实现接口,就只能实现接口中才有的方法,而是说,如果针对接口,而不是具体类,则只能按接口约定办事。...,应该把胖接口方法分组,然后用多个接口代替它,每个接口服务于一个子模块,简单地说,就是使用多个专门接口使用单个接口要好得多。...2.如何遵守: ①父类方法都要在子类中实现或者重写,并且派生类只实现其抽象类中声明方法,而不应该给出多余方法定义或实现 ②在客户端程序 中只应该使用父类对象而不应当直接使用子类对象,这样可以实现运行期绑定...格式为:首先是一个状态行(包括信息协议版本号、一个成功或错误代码),然后是MIME信息(包括服务器信息、实体信息和可能内容) ④客户端接收服务器返回信息并显示 在用户显示屏,然后客户机与服务器断开连接

1K40

设计模式(2):观察者模式-2 (委托、事件)

通俗点来讲,委托有点像方法快捷方式, 通过委托可以执行方法。 声明: 在类中声明, 其声明决定了该委托可用方法。也就是说,委托只可指向具有相同标签(参数、返回值)方法。...发布者: 决定什么时候触发事件。包含事件与委托定义与声明,执行绑定了事件方法(订阅者类中方法)。 订阅者: 决定做什么事(提供具体方法)。 接受事件并提供事件处理程序对象。...事件声明: 1 // 先声明事件委托类型, 事件在生成时会调用委托 2 public delegate void MyDelegateEventHandler(object sender, EventArgs...并且希望这个气象站扩展性良好。...我们可以发现,用 .net 内置事件来实现观察者模式,自己实现简单,控制起来也方便。

49940

JavaSE学习总结(六)——接口与抽象类

既然这样,Animal就不应该实例化,只能作为父类,在面向对象中(OOP)充当这种角色类型有:抽象类,接口。 抽象类与接口是一种类更加抽象类型。...一、不能实例化类型 从上面的概念中可以得知有些类型不应该实例化,没有意义。 ? java中抽象类利于代码维护和重用。 1.因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用。...3.2、接口特点 1)、接口方法可以有参数列表和返回类型,但不能有任何方法体。 2)、接口中可以包含字段,但是会被隐式声明为static和final。...5)、当实现一个接口时,需要将被定义方法声明为public类型,否则为默认访问类型,Java编译器不允许这种情况。 6)、如果没有实现接口中所有方法,那么创建仍然是一个接口。...子类必须实现接口中未实现方法,除非子类也是接口。 7)、扩展一个接口来生成新接口应使用关键字extends,实现一个接口使用implements。

61270

C# .NET面试系列二:面向对象

与类同名:构造函数名称必须与包含它名称完全相同。没有返回类型:构造函数没有返回类型,甚至不能声明 void。它目的是初始化对象,而不是返回值。...性能:struct 性能通常 class 更好,因为它在栈分配内存,避免了堆上垃圾回收开销。但在大型对象情况下,堆上分配可能适用。...通过面向接口编程,可以容易地替换具体实现而不影响调用方代码。可扩展性:接口提供了一种扩展现有功能方式,而无需修改调用方代码。新实现可以实现相同接口,并且可以被现有的调用方直接使用。...通过面向接口开发,代码容易进行维护和扩展,因为可以轻松替换实现而不影响其他部分代码。...这种方式也符合依赖倒置原则(Dependency Inversion Principle),即高层模块不应该依赖于低层模块具体实现,而是应该依赖于抽象。16. 什么时候用重载?什么时候用重写?

16510

面向对象设计原则

里氏代换原则是实现开闭原则重要方式之一,在运用里氏代换原则时,应该将父类设计为抽象类或者接口,让子类继承父类或实现接口,并实现在父类中声明方法,运行时,子类实例替换父类实例,可以很方便扩展系统功能...抽象不应该依赖于细节,细节应当依赖于抽象。换句话说,要针对接口编程,而不是针对实现编程。...依赖倒转原则要求在程序代码中传递传递参数时或者关联关系中,尽量引用层次高抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型转换等,而不要使用具体类来做这些事情...常用注入方式有三种: 构造注入:通过构造函数来传入具体对象。 设置注入:通过setter方法来传入具体对象。 接口注入:通过实现接口声明业务方法来传入具体对象。...这里接口有两种不同含义:一种是指一个类型所具有的方法特征集合,仅仅是一种逻辑抽象;另一种是指某种语言具体接口定义,有严格定义和结构,比如Java语言中interface。

80140

框架设计原则和规范(完)

不要设计有多种状态因子类型 O.考虑将聚合组件集成到Visual Stuio设计器中。 只要实现IComponent接口即可 P.考虑把聚合组件和因子类型分开,各自放到不通程序集中。...要确保begin方法返回类型实现了IAsyncResult接口 iii. 要确保同步方法按值传递和按引用传递参数在Begin方法中都是按值传递 iv....()){ ... } 在资源类析构函数写释放代码,但是无法确定什么时候被释放 1) 要为含有可处置实例类型实现基本Dispose模式。...因此,我们需要用SimulatedCovariance模式: 声明一个IFoo接口模板,在此接口中以T作为类型声明各种所需公共方法。...然后让具体对于泛型类实现时候,用Bar: IFoo来继承 这样所有的Bar类型都有一个公共基类:IFoo,因此也可以调用此基类公共方法。

96540

Java 新特性前瞻:封印类

封印类和接口对可扩展它们类型具有更多控制权, 这对于一般领域建模和构建安全平台库来说都是很有用。...如果一个类型,比如 Shape,限定了接口实现类,我们就可以放心地把它转成 Circle,因为 Shape 将 Circle 列为它已知子类型之一。...实际,《 Effective Java》建议我们“为扩展而设计,否则就禁止扩展”。这是一个很好建议,如果编程语言在这方面为我们提供更多帮助,我们可能会容易接受这个建议。...封印类允许程序库作者将可访问性与可扩展性解耦。这种灵活性很好,但我们应该在什么时候使用呢?当然,我们不希望将 List 变成封印接口,因为对于用户来说,创建新类型 List 是完全合理和可取。...封印类不能作为 lambda 表达式函数接口,也不能作为匿名类基类。 封印类类型必须明确地说明它们扩展性。

58810

理解Golang泛型

泛型类型集type I[T C] interface {~int | ~int32 | ~int64M(v T) T}类型集是接口扩展。...除此之外,我们还需要一些内置复合类型泛型定义,即在类型定义中声明类型参数,可以使用下面范式:undefined// Pick 随机选取数组中一个对象返回// 波浪线表示包含所有基于此类型派生类型(...U泛型类型集泛型类型集是使用公理化集合论方法扩展了原有接口定义,从而实现了泛型类型约束。...同时,中括号在定义时小括号简洁。并且在1.18之前版本Golang中,切换和Map定义都可以广义认为是泛型切片,泛型Map一种特例,从而实现了风格统一。...}这里本意是传递参数需实现Foo方法,那么直接使用接口泛型简单易懂,不需要额外使用泛型语法。

1.3K41
领券