gpt4 book ai didi

java - 如何在模板方法模式中通过两个名称调用模板方法

转载 作者:行者123 更新时间:2023-11-29 08:54:03 39 4
gpt4 key购买 nike

我这样做有点倒退,因为我遵循了特定的项目说明顺序。我有两个 java 类。其中一个模拟 Linux 的 grep 功能,另一个模拟 lineCount 功能。我已经实现了它们,但项目的下一步是使用模板方法模式创建一个父类(super class),该模式“将包含其他两个程序共有的所有字段和算法”。

两者之间有很多共同的功能,很明显哪些部分需要成为模板的一部分,哪些需要成为实现的一部分。例如,它们中的每一个都需要能够根据用于调用方法的路径字符串创建 File 对象,并使用用于调用该方法的正则表达式搜索 File 的列表方法。这是通用功能,绝对应该成为模板/抽象类的一部分。

如果能够声明这样的东西就好了:

public abstract class RegexCommands{
protected Variables;
public Map<things> myMethod(variables){
//common functionality which includes storing and using the variables
hookMethod(); //based on what you create in commonFunctionality
return resultAfterHookMethod;
}
}

public class Grep extends RegexCommands{
public hookMethod(){
class specific things;
}
}

public class lineCount extends RegexCommands{
public hookMethod(){
class specific things;
}
}

然后用

调用它
RegexCommands myObject = new Grep();
myObject.myMethod(variables);

并让它返回我正在寻找的内容(Grep 对象的 grep 命令,LineCount 对象的 lineCount)。但是,说明明确指出它将像这样调用:

RegexCommands myObject = new Grep();
myObject.grep(variables);

RegexCommands myObject = new LineCount();
myObject.lineCount(variables);

而且使用的变量也有细微差别。 (例如,lineCount 不需要 substringSelectionPattern)我现在设置它的方式是 Hook 方法调用 super 到它们的父级,模板调用 myMethod。这显然不是它应该工作的方式。一方面,似乎我不得不在我的模板中引入非通用方法,这些方法只调用主模板方法,这意味着理论上(尽管我还没有测试过)可以做类似的事情

RegexCommands myObject = new LineCount();
myObject.grep(variables);

这不是我想要允许的行为,而且似乎违背了使用模板的目的。另一个问题(我实际上遇到过)是我的 hookMethods 似乎无法访问在 commonFunctionality 中创建的实例变量(即当我尝试访问在 commonFunctionality 中创建的匹配器时,它返回 null 即使我将其声明为实例变量而不是方法级范围,就像我更喜欢的那样)。

所以我有点卡住了,正在寻求帮助。我如何让这些对象在模板中使用 myMethod 模式而没有这种破坏我的对象的分离性的可怕解决方法,以及我如何让非通用方法使用来自 commonFunctionality 的 ArrayLists 和/或映射而不将所有内容作为参数传递(有人建议我不要这样做,因为它破坏了使用模板的意义)?

最佳答案

For one thing, it seems like I have had to introduce non-common methods to my template that just call the main template method,

是的,您需要为给定的要求引入此类方法。但是正如您稍后所说,这是不正确的,因为 LineCount 对象可以调用 grep 方法,这可以通过在您将要编写的非常用方法中执行 instance of 检查来避免。如果工作符合预期的要求,则执行该工作,否则就退出。

对于你原来遇到的问题

my hookMethods don't seem to have access to the instance variables created in commonFunctionality (ie when I try to access a matcher that was created in commonFunctionality, it returns null even if I declare it as an instance variable instead of a method-level scope, like I would prefer).

不能在java中定义抽象变量,java中唯一合法的变量修饰符是

public, protected, private, static, final, transient, volatile 

你需要有一个 commonFunctionality 的具体实现,你可以为它提供一个 getter 方法。您可以在抽象类中为此定义一个抽象方法。有关更多信息,请参阅此帖子的答案 Abstract variables in Java?

关于java - 如何在模板方法模式中通过两个名称调用模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21277701/

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