Подкласс Java с использованием данных из другого подкласса того же суперкласса - PullRequest
0 голосов
/ 23 октября 2018

Я создал 3 класса, один суперкласс "a" и два подкласса "b" и "c".Я создаю экземпляр c, задаю ему целое число «n», а затем использую подкласс b, чтобы выполнить некоторые вычисления.У меня проблема в том, что когда я создаю экземпляр c для вызова b, данные технически принадлежат суперклассу a / c, верно?поэтому, когда я создаю экземпляр b с

b b_instance = new b ();

внутри экземпляра c, вызываемая мной функция b calc () возвращает 0. Я предполагаю, что этопотому что b имеет свою собственную эко-сферу данных?

Как мне это сделать?

2)

Кроме того, как я могу вызвать функцию суперкласса с тем же именем?

Спасибо!

public class prog
{
   public static void main(String args[])
   {  
       c c1 = new c();
       c1.run();

   }
}

class a
{
   private int number;

   void set_number(int n)
   {
      number = n;
   }

   int get_number()
   {
      return number;
   }

   int calc()
   {
      return number*2;
   }

}

class b extends a
{
   int calc()
   {
      // calling the superclass function calc, then subtract
      return super.calc() - get_number();
   }
}

class c extends a
{


   void run()
   {
      set_number(1);
      b b1 = new b();
      System.out.println(b1.calc());
   }

}

проблема бесконечного цикла

public class prog
{
   public static void main(String args[])
   {  
      c c1 = new c();
      c1.run();

   }
}

class a
{   
   void calc_a()
   {
      System.out.println("")  ;
   }

   void calc_b()
   {
      calc_a(); // meaning the calc_a() in the superclass
   }
}

class b extends a
{
   void calc_a()
   {
      super.calc_b();
   }
}

class c extends a
{
   void run()
   {
      b b1 = new b();
      b1.calc_b();
   }
}

1 Ответ

0 голосов
/ 23 октября 2018

b b_instance = new b ();

внутри экземпляра c, вызываемая мной функция b calc () вернет 0. Я думаю, это потому, что b имеет свою собственную эко-сферуданные?

Как мне это сделать?

«Пара» возможных способов.Я бы рассмотрел расширение c с b, таким образом c получает всю функциональность a и b, что-то вроде ...

class c extends b {

    void run() {
        set_number(1);
        System.out.println(calc());
    }

}

ЕСЛИ, однако, этонеосуществимо (по той или иной причине), тогда вам нужно передать значение, которое c имеет b, что-то вроде ...

class c extends a {

    void run() {
        set_number(1);
        b b1 = new b();
        b1.set_number(get_number());
        System.out.println(b1.calc());
    }

}

Теперь, сказав, что это "пахнет "для меня.Какой смысл расширяться с a, чтобы c мог выполнять b?Это вызвало бы у меня тревожные звонки.

Проблема в том, что если ваш звонок c#calc, он просто перейдет к a calc методу ... который, основываясь на run,кажется, что это не то, чего вы хотите достичь, так что это просто большой беспорядок

2)

Кроме того, как я могу вызвать функцию суперкласса с тем же именем?

Поскольку вызов calc напрямую вызовет StackOverflowError, потому что вы постоянно звоните себе.

В этом случае вы выполняете операцию, для которой aделать и вносить изменения в него.Это обычная практика в языках OO.

Примечания ...

Java (и сообщество Java) уже имеют четко определенный набор методов кодирования.Вам нужно потратить время на их изучение, это облегчит чтение вашего кода и облегчит чтение кодов других людей.

Начните с Условные обозначения для языка программирования Java TM

Имена классов должны начинаться с заглавной буквы, а методы - в camelCase, например ...

class A {

    private int number;

    void setNumber(int n) {
        number = n;
    }

    int getNumber() {
        return number;
    }

    int calc() {
        return number * 2;
    }

}

Обновлено ...

class a {

    void calc_a() {
        System.out.println("");
    }

    void calc_b() {
        calc_a(); // meaning the calc_a() in the superclass
    }

}

class b extends a {

    void calc_a() {
        super.calc_b();
    }
}

class c extends a {

    void run() {
        b b1 = new b();
        b1.calc_b();
    }

}

Вопрос, который вам нужно задать себе: почему b нужно переопределить calc_a?Почему бы не переопределить calc_b?Это решило бы проблему

как мне это переопределить?

class b extends a {

    //void calc_a() {
    //    super.calc_b();
    //}
    @Override 
    void calc_b() {
        super.calc_b();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...