2015-12-25 8 views
-1

ACM libray содержит класс RandomGenerator. Один использует класс как это:Java simple class extend case

private RandomGenerator rgen = RandomGenerator.getInstance(); 

//now, use rgen 

деЫпзЬапс() является статическим

Я пытаюсь продлить этот класс, но я не понимаю, как.

Вот мой код:

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

сделать что-то же самое, RandomGeneratorwithStrings RGEN = (RandomGenerator) RandomGeneratorwithStrings.getInstance(); –

+0

явное приведение необходимо, которая будет брошена в ребенка типа –

+0

@vishal gajera: не работает – StackXZ

ответ

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 无法 强 转为 子 类 Случайный генератор со строками, 而 子 类 Случайный генератор со строками 可以 向上 转为 父 类 RandomGenerator.

+0

Впечатляет! С рождеством! – StackXZ

+1

上面 错误 的 原因 在于 и другие китайские тексты не помогают людям, не говорящим по-китайски. Было бы полезно использовать текст на английском языке только в StackOverflow. – glglgl

0

Поскольку RandomGeneratorwithStrings.getInstance(); вызывает статический метод getInstance() из унаследованного класса, который является RandomGenerator. Помните статические методы, которые не переопределяются, поэтому всякий раз, когда вы выполняете метод getInstance(), вы вызываете метод из RandomGenerator, который возвращает RandomGenerator генератор объекта. Поэтому, когда вы назначаете его своему пользовательскому классу, который расширяет RandomGenerator, вы являетесь downcasting.

+0

Merry Christmass и спасибо для ответа. Я получаю: 'ja va.lang.ClassCastException: acm.util.RandomGenerator нельзя отнести к RandomGeneratorwithStrings' – StackXZ

+0

Это неверно. –

+0

@ Oliver Charlesworth: Если у вас есть идеи, как я могу решить свою проблему, я бы очень признателен! Благодаря! – StackXZ

0

Я бы обеспечил соблюдение «Состав над наследованием» практики.

public class RandomStringGenerator { 
    private RandomGenerator randomGenerator; 
    public String getRandomString(int chars) { 
     //... 
    } 
} 

С моей точки зрения, это не слишком много смысла, чтобы расширить RandomGenerator, так как вы не выиграют от полиморфизма (с наследованием вам придется бросить RandomGenerator к RandomStringGenerator, поскольку getRandomString не определен . суперкласс