Java - ссылка на метод в другом классе - PullRequest
0 голосов
/ 04 августа 2011

Я пришел из C-программирования, поэтому я новичок в концепции ООП. У меня вопрос такой:

Я пытаюсь протестировать несколько модулей, поэтому я решил написать класс-оболочку для общей функциональности, чтобы я мог вызывать эти методы из других классов. Но меня смущает то, что если я сделаю другие классы extends из myWrapperClass, я все равно не смогу использовать методы классов-оболочек, если они не определены static (а в большинстве уроков говорится, что, по возможности, старайтесь держаться подальше от static ) или мне нужно создать новый экземпляр класса-оболочки, используя new.

Тогда какой смысл использовать extends? Если я должен идти по этому пути, есть ли какой-нибудь короткий путь, использующий их вместо того, чтобы писать myclass.wrapperclassfunction() каждый раз?

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 04 августа 2011

, поэтому я могу вызывать эти методы из других классов.но где я запутался.если я сделаю другие классы расширяемыми из myWrapperClass, я все равно не смогу использовать методы классов-оболочек, если они не определены как static

Это ложно.

Вы можете абсолютно это сделать.

public class MyWrapperClass {

     public void commonMethod() {
     }

}

public class YourClass extends MyWrapperClass {

     public void anotherMethod() {
            commonMethod();
            // other stuff
     }
}
0 голосов
/ 04 августа 2011

убедитесь, что вы объявили, что ваша класс-оболочка не является частным в вашем классе-оболочке.

public class wrapperClasss{

private wrapperMethod(){}
}

public class Myclass extends wrapperClasss{

  private myMethod(){
    wrapperMethod();//this is a compile erro
   }
}
0 голосов
/ 04 августа 2011

[редактировать сводку о выпуске OP]:

Вам необходимо рассмотреть различие между примитивными и объектными типами в Java.

Примитивный тип может быть просто объявлен и использован:

   int f; // Java (or is c? :)
   f = 10;

Тип объекта должен быть выделен.(Для программистов на C: объекты Java распределяются динамически. Подумайте, куча, а не стек.)

   Foo myFoo = new Foo(); // Java
   struct foo *myFoo = (struct foo *) malloc(sizeof(struct foo)); // good old C

- первоначальный ответ -

Ваша путаница заключается в следующем:

Читая между строк, кажется, что вы думаете, что просто информируя систему типов о существовании расширения базы, вы сможете волшебным образом начать вызывать методы для этого типа .

И вот почему вы остановились на статических методах: они не требуют создания экземпляра - что вы, очевидно, отказываетесь делать!

Допустим, у вас есть что-то вродеОтвет Кая (который является правильным между прочим) выше.

Затем:

/** using Kai's classes */
public void foobar() {
   YourClass foo = new YourClass();
   foo.commonMethod();  // try it ..   
}

Просмотрите то, что вы должны знаете о просто , определяя и используяstruct в C.

Теперь забудьте это:

  typedef struct {
          int foo;
          char bar[3];
  } extended;

  extended s;  // this is not just declaring s; it is also allocating it
  s.foo = 10;  // hey, no malloc. nasty Java insists on new ..

В Java, когда вы говорите:

   SomeClass s; // s declared but not instantiated (think 'allocated')  

, вы должны создать экземпляр объекта.

  s = new SomeClass(); 
0 голосов
/ 04 августа 2011

Если общая функциональность идентичных методов в различных модулях (подклассах), то вы можете просто разделить ее из модулей в общий суперкласс и просто определить метод, определенный там.Если метод реализован по-разному в каждом подклассе, но вы хотите вызывать его одинаково, независимо от того, какой у вас экземпляр подкласса, вы можете объявить его как abstract в суперклассе и иметь реализацию в каждом подклассе.Если это что-то промежуточное - все, кроме нескольких подклассов, имеют одинаковую реализацию - тогда вы можете выделить наиболее распространенную реализацию в суперкласс и переопределить ее в исключительных подклассах.

...