我知道这是接口的目的,类可以被声明为抽象的以从中逃逸。但是实现我们在接口中声明的所有方法有什么用呢?如果我们继续定义所有方法,即使这些方法与该类无关,这不会增加代码的重量和复杂性吗?为什么设计成这样?
z9ju0rcb1#
这可能取决于liskov替代原理所以,有 A implements B 意味着你可以使用 A 什么时候 B 是必要的,为了让它顺利运行, A 必须至少有相同的方法 B .请记住,我的不是一个“正确”的答案,因为它不是基于官方来源!
A implements B
A
B
u5rb5r592#
如果我们继续定义所有方法,即使这些方法与该类无关,这不会增加代码的重量和复杂性吗?是的,你是对的。这就是为什么在您的编码中遵循接口隔离原则是最佳实践,该原则建议不要强迫客户机实现他们不使用的接口。因此,您永远不应该有一个包含许多方法的“胖”接口,而应该有许多小接口分组方法,每个组服务于特定的行为或子模块。这样,接口的客户机只实现所需的方法,而不会被迫实现他们不需要的方法。
ztigrdn83#
java中接口的概念非常类似于契约(回想起来,也许这应该是概念的名称)其思想是,实现接口的类郑重承诺提供合同中列出的所有内容,这样,实现接口的类的任何使用都可以保证该功能可用。根据我的经验,这个设施是使用java构建大教堂成为可能的因素之一。
rqdpfwrv4#
你批评的正是你要达到的目标。如果不想实现接口,不要声明实现接口的类。如果我们继续定义所有方法,即使这些方法与该类无关,这不会增加代码的重量和复杂性吗?当您针对一个接口编程时,您希望它背后的具体对象实现它的所有方法。如果您的具体对象不需要或无法实现所有接口方法,那么您可能需要解决一个设计问题。
d4so4syb5#
当任何一段代码在不知道接口后面是什么类的情况下接收到接口示例时,应该确保该代码能够调用接口中的任何方法。这就是使接口成为调用者和功能提供者之间的契约的原因。实现这一点的唯一方法是要求实现接口的所有非抽象类为接口的所有函数提供实现。有两种方法可以解决不需要实现某些功能的问题:添加一个tester方法和一个抛出 UnsupportedOperationException ,和根据需要将接口拆分为多个部分,以便可以实现一个部分的所有方法。以下是第一种方法的示例:
UnsupportedOperationException
public interface WithOptionalMehtods { void Optional1(); void Optional2(); boolean implementsOptional1(); boolean implementsOptional2(); } public class Impl implements WithOptionalMehtods { public void Optional1() { System.out.println("Optional1"); } public void Optional2() { throw new UnsupportedOperationException(); } public boolean implementsOptional1() { return true; } public boolean implementsOptional2() { return false; } }
下面是第二种方法的示例:
public interface Part1 { void Optional1(); } public interface Part2 { void Optional2(); } public Impl implements Part1 { public void Optional1() { System.out.println("Optional1"); } }
rfbsl7qr6#
在实现一个接口时,我们可能不需要定义接口中声明的所有方法。我们可以定义一些我们不需要的方法,但在体中没有任何内容。
6条答案
按热度按时间z9ju0rcb1#
这可能取决于liskov替代原理
所以,有
A implements B
意味着你可以使用A
什么时候B
是必要的,为了让它顺利运行,A
必须至少有相同的方法B
.请记住,我的不是一个“正确”的答案,因为它不是基于官方来源!
u5rb5r592#
如果我们继续定义所有方法,即使这些方法与该类无关,这不会增加代码的重量和复杂性吗?
是的,你是对的。这就是为什么在您的编码中遵循接口隔离原则是最佳实践,该原则建议不要强迫客户机实现他们不使用的接口。因此,您永远不应该有一个包含许多方法的“胖”接口,而应该有许多小接口分组方法,每个组服务于特定的行为或子模块。
这样,接口的客户机只实现所需的方法,而不会被迫实现他们不需要的方法。
ztigrdn83#
java中接口的概念非常类似于契约(回想起来,也许这应该是概念的名称)
其思想是,实现接口的类郑重承诺提供合同中列出的所有内容,这样,实现接口的类的任何使用都可以保证该功能可用。
根据我的经验,这个设施是使用java构建大教堂成为可能的因素之一。
rqdpfwrv4#
你批评的正是你要达到的目标。如果不想实现接口,不要声明实现接口的类。
如果我们继续定义所有方法,即使这些方法与该类无关,这不会增加代码的重量和复杂性吗?
当您针对一个接口编程时,您希望它背后的具体对象实现它的所有方法。如果您的具体对象不需要或无法实现所有接口方法,那么您可能需要解决一个设计问题。
d4so4syb5#
当任何一段代码在不知道接口后面是什么类的情况下接收到接口示例时,应该确保该代码能够调用接口中的任何方法。这就是使接口成为调用者和功能提供者之间的契约的原因。实现这一点的唯一方法是要求实现接口的所有非抽象类为接口的所有函数提供实现。
有两种方法可以解决不需要实现某些功能的问题:
添加一个tester方法和一个抛出
UnsupportedOperationException
,和根据需要将接口拆分为多个部分,以便可以实现一个部分的所有方法。
以下是第一种方法的示例:
下面是第二种方法的示例:
rfbsl7qr6#
在实现一个接口时,我们可能不需要定义接口中声明的所有方法。我们可以定义一些我们不需要的方法,但在体中没有任何内容。