2012-04-24 4 views
1

Я хотел бы назвать функцию расширенного класса. Как это может быть сделано?Функция вызова расширенного класса

class Main{ 
    Function(); 
} 

class Other extends Main{ 
    public void Function() { /* The function code */ } 
} 
+4

ли вы имеете в виду, возможно, вызвать метод супер, в то есть 'super.Function()'? Ваш вопрос довольно расплывчатый и оставляет много важных деталей. Можете ли вы прояснить ситуацию, поэтому нам не нужно угадывать? –

+0

Что касается вашего комментария: «У вас есть это по-другому. Я хочу, чтобы главный класс вызывал функцию, написанную в другом классе». Нет, нет, вы никогда этого не хотите, поскольку родительский класс должен ** никогда ** не зависят от класса ребенка, когда-либо. Вместо того, чтобы рассказать нам, как в коде вы пытаетесь решить эту проблему, расскажите нам, какую общую проблему вы пытаетесь решить. Я подозреваю, что наследование не участвует в правильном решении. –

ответ

0

Вы можете определить Main как абстрактный класс, и определить function() как абстрактный метод, реализованный в Other подкласса. В какой-то момент вам придется создать экземпляр Other.

+0

Я использовал экземпляр: Другой экземпляр = новый Другое(); И попробовал позвонить: Другое.Функция() Назад в основной класс. В нем говорится, что он не может найти функцию. Я думаю, что я не понимаю, как это работает. Я много читал об этом. Можете ли вы дать немного больше отзывов о том, как это сделать, пожалуйста? – user1042304

+0

Не могли бы вы предоставить полный источник? Вероятно, вы просто должны называть 'Function()' в основном классе, а не 'Other.Function()', так как Main имеет метод 'Function' - он просто реализуется' Other'. –

0
class Main { 
    public void Function() { F2(); } 

    public abstract void F2(); 
} 

class Other extends Main { 
    public void F2() { /* code here */ } 
} 
+0

У вас есть это по-другому. Я хочу, чтобы Main Class вызывал функцию, написанную в другом классе. – user1042304

+0

Обновлено в соответствии с вашими комментариями. –

+0

@ user1042304: no вы никогда не должны этого делать. Пожалуйста, просмотрите мой комментарий к исходному вопросу. Чтобы получить лучшую помощь, расскажите нам подробности, включая общую проблему, которую вы пытаетесь решить, а не то, как вы пытаетесь ее решить. –

2
public class BaseCls { 
    void function() { 
     System.out.println("Base"); 
    } 
} 



public class ExtCls extends BaseCls { 
void function() { 
    super.function(); 
    System.out.println("ExtCls"); 
} 

public static void main(String args[]) { 
    new ExtCls().function(); 
    } 
} 
0

Класс Main не имеет особых привилегий в отношении того, что в классе Other, который не в классе Main. Кроме того, объект Main не обязательно является объектом Other. Поэтому вам необходимо определить поведение, когда объект класса Main вызывает Function(). Вы можете

  • Объявить Function() быть абстрактным, то есть вы не можете создать объект класса Main и класса Other вынужден определить Function() или быть абстрагироваться, или
  • Объявить реализацию по умолчанию в классе Main, который работает для объектов, которые являются Main s, а не Other s.

В любом случае это приемлемо в зависимости от ситуации. Вы должны дать более подробную информацию, если хотите помочь выбрать, какой из них лучше в вашей ситуации.

Пример:

class Main { 
    public abstract void Function();  

    private void SomeFunction() { 
     Function(); 
    } 
} 

class Other extends Main { 
    public void Function() { /* code here */ } 

} 

или

class Main { 
    public void function() { /* default code here, can be empty */ };  

    public void someFunction() { 
     function(); 
    } 
} 

class Other extends Main { 
    public void function() { /* code here */ } 

} 

class Example { 
    public void example() { 
     Main main = new Main(); 
     Other other = new Other(); 

     main.function(); // call the function defined in class Main 
     other.function(); // call the function defined in class Other 

     main.someFunction(); // call Main.someFunction, which calls Main.function 
     other.someFunction(); // call Main.someFunction, which calls Other.function 
    } 
} 
+0

Мне понравился второй вариант, однако функция() не изменена расширенным классом. – user1042304

+0

@ user1042304, вы не можете иметь его в обоих направлениях. Либо вы хотите вызвать функцию, которая определена в расширенном классе, либо нет. Если расширенный класс не изменяет функцию, то в каком смысле это «функция расширенного класса»? –

+0

Я хочу вызвать функцию, созданную в расширенном классе. Но ваше предложение здесь показывает функцию() как пустую, определенную в основном классе, а затем снова определенную в расширенном классе. – user1042304

Смежные вопросы