gpt4 book ai didi

java - OOP:有没有简单的接口(interface)提取和不那么冗长的自动转发的习惯用法?

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:45 25 4
gpt4 key购买 nike


编辑

尽管我在下面使用伪 Java 语法进行说明,但这个问题不限于任何一种编程语言。请随意发布您最喜欢的编程语言的习语或语言提供的机制。


当尝试通过组合而不是继承重用现有类 Old 时,首先从现有类中手动创建一个新接口(interface),然后在 New 中编写转发函数是非常繁琐的。如果 Old 中有大量公共(public)方法,而您只需要覆盖其中的一小部分,那么这个练习就会变得特别浪费。

忽略像 Eclipse 这样的 IDE,它虽然可以帮助完成这个过程,但仍然不能减少由此产生的必须阅读和维护的代码的冗长性,这将极大地帮助有几种语言机制来......

  1. 自动提取 Old 的公共(public)方法,例如,通过 interfaceOf 运算符;和

  2. 默认情况下,将 Old 的所有自动生成的接口(interface)方法(例如,通过 forwardsTo 运算符)转发到 Old 的组合实例,您只需提供您希望在 New 中覆盖的少数方法的定义。

一个例子:

// A hypothetical, Java-like language
class Old {
public void a() { }
public void b() { }
public void c() { }

private void d() { }
protected void e() { }
// ...
}

class New implements interfaceOf Old {
public New() {
// This would auto-forward all Old methods to _composed
// except the ones overridden in New.

Old forwardsTo _composed;
}

// The only method of Old that is being overridden in New.
public void b() {
_composed.b();
}

private Old _composed;
}

我的问题是:

  1. 这是否可能在代码级别(例如,通过一些可重用设计模式或习语),以便在 New 和像 New 这样的类?

  2. 是否有提供此类机制的任何其他语言?

编辑

现在,我并不了解这些语言的细节,但我希望像 Scheme、Lisp、Clojure 这样的“Lispy”语言不会让您失望……毕竟 Lisp 是一种“可编程编程”语言”(根据 Paul Graham 和其他人的说法)。

编辑 2

我可能不是 Old 的作者,或者可能不想更改其源代码,实际上是想将其用作黑盒。

最佳答案

这可以用允许您指定一个包罗万象的魔术方法的语言来完成(例如 php 中的 __call())。您可以在这里捕获任何您没有特别覆盖的函数调用,检查它是否存在于 Old 类中,如果存在,则转发调用。

像这样:

public function __call($name, $args)
{
if (method_exists($old, $name))
{
call_user_func([$obj, $name], $args);
}
}

关于java - OOP:有没有简单的接口(interface)提取和不那么冗长的自动转发的习惯用法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20589892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com