2014-01-11 32 views
0

我有一个库的图像类,我试图扩展。超类方法在几种情况下返回新的超类对象。如何在超类方法返回的对象上使用子类方法?有没有办法将超类对象改为子类对象?有没有办法将一个超类obj变成一个子类obj?

public class LibraryClass extends SomeBaseClass { 
    LibraryClass someMethodThatChangesDataReturningNewObject() { 
    } 
} 

public class MyClass extends LibraryClass { 
    // methods that extends functionality 

    // possible to override superclass method calling it and turning the LibraryClass 
    // obj into a MyClass obj and return that? 
} 

someRandomMethod() { 
    MyClass obj = new MyClass; 
    LibraryClass newObj = obj.someMethodThatChangesDataReturningNewObject(); 
    // possible to bind my subclass methods to newObj? 
} 
+0

只需使用一个演员。 – ApproachingDarknessFish

+0

Valek - 如果你的意思是(LibraryClass)obj。我想我的问题并不清楚。如果你的意思是(MyClass)newObj,这是我的理解,将无法正常工作。我想知道是否有一种方法可以创建一个需要超类并返回子类的复制构造函数。或者其他一些缩小范围的方法。从超类到子类。 – alex

+0

你为什么想这样做?如果您需要将newObj传递给期望MyClass的方法,那么只要您遵守Liskov替换原则,就应该可以这样做。你真正的问题是什么? –

回答

1

那么,你可以做这样的事情:

MyClass obj = new MyClass(); 
MyClass newObj = (MyClass) obj.someMethodThatChangesDataReturningNewObject(); 

你只需要确保你的MyClass.someMethodThatChangesDataReturningNewObject()实现事实上确实返回MyClass一个实例。如果该方法的实现只是调用父实现,那么你会更安全的包装中投在if语句如下:

MyClass obj = new MyClass(); 
LibraryClass newLibraryClass = obj.someMethodThatChangesDataReturningNewObject(); 
if (newLibraryClass instanceof MyClass) { 
    MyClass newObj = (MyClass) newLibraryClass; 
    // MyClass specific processing here 
} 

在这种情况下,如果对象是不是MyClass一个实例,你将不会得到ClassCastException。请记住,如果它不是MyClass的实例,那么该处理将不会执行。

唯一的方法是创建一个构造函数或其他实用程序方法,该方法可以使用来自LibraryClass的数据创建新的MyClass实例。这可能或不可能,这取决于LibraryClass中的字段或获取者/设置者是私密还是保护/公开。不知道LibraryClass的任何细节,很难说。但我希望它看起来类似于:

MyClass(LibraryClass libraryClass) { 
    this.setField1(libraryClass.getField1()); 
    this.setField2(libraryClass.getField2()); 
    ... 
} 
相关问题