ACM libray包含RandomGenerator类。一个人使用这样的类:
private RandomGenerator rgen = RandomGenerator.getInstance();
//now, use rgen
getInstance()是静态的
我正在尝试扩展该课程,但我不明白如何。
这是我的代码:
public class RandomGeneratorwithStrings extends RandomGenerator
{
public String get_random_string(int characters)
{
//...
}
}
如果我这样称呼它:
private RandomGeneratorwithStrings rgen = RandomGeneratorwithStrings.getInstance();
我得到Type mismatch: cannot convert from RandomGenerator to RandomGeneratorwithStrings.
如果我这样称呼它:
private RandomGeneratorwithStrings rgen =
(RandomGeneratorwithStrings) RandomGeneratorwithStrings.getInstance();
我得到java.lang.ClassCastException: acm.util.RandomGenerator cannot be cast to RandomGeneratorwithStrings
答案 0 :(得分:0)
因为RandomGeneratorwithStrings.getInstance();
从继承的类getInstance()
调用静态方法RandomGenerator
方法。记住静态方法没有被覆盖,所以每当你执行getInstance()
方法时,你都会从RandomGenerator
调用返回RandomGenerator
生成器对象的方法。因此,当您将其分配到扩展RandomGenerator
的自定义类时,您将downcasting它。
答案 1 :(得分:0)
public class RandomGeneratorwithStrings extends RandomGenerator {
private static RandomGeneratorwithStrings instance = new RandomGeneratorwithStrings();
public static RandomGeneratorwithStrings getInstance() {
return instance;
}
public String get_random_string(int characters) {
// ...
return "Merry Christmass";
}
}
然后你可以使用RandomGeneratorwithStrings,如RandomGenerator(然后,你就可以像使用RandomGenerator一样使用RandomGeneratorwithStrings了):
RandomGeneratorwithStrings rgen = RandomGeneratorwithStrings.getInstance();
System.out.println(rgen.nextInt());
System.out.println(rgen.get_random_string(1));
(上面错误的原因在于): RandomGeneratorwithStrings继承了RandomGenerator,所以,父类RandomGenerator无法强转为子类RandomGeneratorwithStrings,而子类RandomGeneratorwithStrings可以向上转为父类RandomGenerator。
答案 2 :(得分:0)
我会强制执行"撰写而不是继承" 做法。
public class RandomStringGenerator {
private RandomGenerator randomGenerator;
public String getRandomString(int chars) {
//...
}
}
从我的观点来看,扩展RandomGenerator
并没有多大意义,因为你不会从多态中受益(使用继承你必须将RandomGenerator
转换为RandomStringGenerator
,因为getRandomString
未在超类中定义。