2012-10-27 51 views
0

我有一个抽象类类型,我继承创建新类。作为一个相当于例如,考虑:Java静态方法:创建当前类型的对象

public abstract class BaseClass { 
    public BaseClass(String input) 
    { 
     ... 
    } 
    public abstract void doSomething(); 
    public String getResult() 
    { 
     ... 
    } 
} 

现在我可以覆盖BaseClass的,实行“DoSomething的”执行不同的操作(例如,逆转或利用,如果我真的对字符串进行操作,虽然我不是真的,这只是一个例子)。

最常见的用法是:

BaseClass bc = new ExtendsBaseClass(input); 
bc.doSomething(); 
String result = bc.getResult() 

所以我想为这一个静态的包装方法。
我想实现:

public static String doSomethingForResult(String input) 
{ 
    BaseClass bc = /*new current type*/; 
    bc.doSomething(); 
    return bc.getResult(); 
} 

但我不知道如何处理替换评论,或如何使它工作;我不想强迫每个实现类重新实现它(如果这在概念上是可能的,因为abstract static是不允许的)

+0

您可以有一个单独的工厂类,可以创建子类的实例。 'BaseClass bc = BCFactory.getDefaultInstance();'。但是你不应该使用这种静态方法。 –

回答

2

静态方法不是多态的,因此不能被继承和重载。想要做的是不可能的

+0

那么,它们是遗传的。虽然你可能是正确的,这是不可能的。 – Retsam

2

你为什么用一成不变的东西懒得在这种情况下

从多态性只是受益,合并doSomething()getResult()

你最终会得到:?

public abstract class BaseClass { 
    public BaseClass(String input) 
    { 
     ... 
    } 
    public abstract String doSomething(); 
} 

和你的客户会是这样的:

BaseClass bc = new ExtendsBaseClass(input); 
String result = bc.doSomething(); 

在一般情况下,定义分离getResult()方法会使得在特定情况下感觉像在实施生成器模式。事实上,几种不同的方法参与到对象构造中,并最终调用一种getResult()方法。

---------------------在您的评论正下方------------------- -----

如果如你所说,通常情况下是使用doSomething()遵循getResult(),并根据具体的子类,你可以使用模板方法模式

public abstract class BaseClass { 
     public BaseClass(String input) 
     { 
      // assigments 
     } 

     public String process(){ //process is a template method 
     doSomething(); 
     return getResult(); 
     } 

     protected abstract void doSomething(); 

     protected abstract String getResult(); 
} 

public class ExtendedClass extends BaseClass { 

    protected void doSomething(){ 
    //... 
    } 

    protected String getResult(){ 
    //.... 
    } 
} 

你客户只会拨打process()方法:

BaseClass bc = new ExtendsBaseClass(input); 
String result = bc.process(); 

但是请:),尽可能避免静态的东西,它们不会导致一个很好的OO编程。

+0

我想我可能过分简化了我的例子。实际上,我正在使用Bitmaps而不是Strings。我把一个位图作为输入,但是它的存储和处理都是2D颜色数组。然后我的结果方法将它重新组合为一个Bitmap。但我不确定我总是想把它放回到一起,我可能想将原始处理的数组传递给另一个方法。 – Retsam

+0

@Retsam看看我在这篇文章中的更新。 – Mik378

-1

我想你可以在BaseClass中定义一个静态方法,并使用BaseClass作为参数类,例如将其他类作为参数传递给它。

public static String doSomethingForResult(String input ,BaseClass bc){ 
    bc.doSomething(); 
    return bc.getResult(); 
} 

然后在你的ExtendedBaseClass你不妨写:

ExtendedBaseClass extendedBaseObject= new ExtendedBaseClass(); 
    String result = BaseClass.doSomethingForResult("input", extendedBaseObject); 
    System.out.println(result); 
+0

@NagetiveVoter:请留下一些评论。 –

+0

这里你只是用静态方法重新实现了模板方法的概念。但是,doSomethingForResult永远不会被覆盖,因为静态方法不会导致OO反模式。 – Mik378

+0

@ Mik378:我认为OP想要作为包装的静态方法:“'所以我想为此做一个静态包装方法。”。在'doSomethingForResult'中调用的方法,即'doSomething'和'getResult'是真正可以完全覆盖的方法。 –

0

所以我想为这一个静态的包装方法。

我想我明白你为什么想要这样做。您需要一个简单的方法来执行一组通用的操作,而不必一再复制样板代码。但正如你现在所知道的那样,静态方法在继承层次结构中没有地位。我建议你从各种Apache Commons项目及其XxxUtils类中获得灵感,这些类仅由静态方法组成,并完全存在于它们所作用的类的层次结构之外。

考虑Commons IO中的类别FileUtils。这只是静态方法,但它们非常有用。考虑两种方法:

static byte[] readFileToByteArray(File file) // Reads the contents of a file into a byte array. 
static String readFileToString(File file) // Reads the contents of a file into a String 

一种方法处理文件和字节数组,另一种处理文件和字符串?你怎么知道哪个是做什么的 - 因为它使用描述性的名字来描述它。由于FileUtils完全存在于文件,字符串,字节数组等的继承层次结构之外,所以没有继承,实现和多态性问题。我们回到假设的方法。我会把这个方法放在一个名为MyUtils的单独的类中 - 或者BitmapUtils中,并且为每个有意义的具体类的组合创建一个方法。

public static String doSomethingWithExtendsBaseClass(String input) 
{ 
    BaseClass bc = new ExtendsBaseClass(); 
    bc.doSomething(); 
    return bc.getResult(); 
} 

public static String doSomethingWithOtherClass(String input) 
{ 
    BaseClass bc = new OtherClass(); 
    bc.doSomething(); 
    return bc.getResult(); 
} 

但我不知道如何处理替换评论,或如何使它工作

简单 - 你只需要直接实例化的具体类与相应名称的方式。

相关问题