2016-05-04 4 views
-3

Как я могу вызвать метод подкласса работы(), если эта линия должна оставаться такой же:Как я могу назвать метод подкласса?

Employee secretary = new Secretary();

public class Employee { 
} 

public class Secretary extends Employee { 
    public void work() {}; 
} 

public static void main(String[] args) { 
    Employee secretary = new Secretary(); 
    //secretary.work(); 
} 
+2

Если вам нужно вызвать 'work' метод на' Employee', вы бы лучше убедиться, что 'сотрудников 'метод имеет метод' work'. В настоящее время вам не лучше, чем просто сказать «Секретарь секретаря = новый секретарь()». – hexafraction

+1

Чувства, как вопрос домашнего задания ... –

+5

Ваш '' секретарь' даже не расширяет '' Employee''. – f1sh

ответ

3

Ваш класс секретарь обязательно проходит Employee

public static class Employee { 
} 

public static class Secretary extends Employee{ 
    public void work() { 
    } 
} 

public static void main(String[] args) { 
    Employee secretary = new Secretary(); 
    ((Secretary)secretary).work(); 
} 

И потому, что secretary является объявленный как Employee, вы не можете вызывать методы класса Secretary, вам необходимо его отличить:

((Secretary)secretary).work(); 

Это скажет составителю, что ваш secretary является EmployeeSecretary типа, а затем вы сможете вызвать метод work().

2

Что следует использовать для расширения класса, если родитель должен знать методы API? Это нарушает концепцию абстракции (что подразумевается в вашей необходимости вызывать метод переменной, объявленной как родительский тип)

Имеет смысл объявить метод work() в родительском, сделать класс абстрактным и реализовать это у ребенка.

public abstract class Employee { 
    public abstract void work(); 
} 

public class Secretary extends Employee { 
    public void work() { 
     //Implement here... 
    }; 
} 

public static void main(String[] args) { 
    Employee secretary = new Secretary(); 
    //secretary.work(); 
} 
1

Когда вы говорите Secretary extends Employee означает Secretary будет иметь все открытые и защищенные вещи в Employee Таким образом, не следует ожидать, что вы получите все вещи в объекте типа Employee.

вы можете сделать что-то вроде этого

public abstract class Employee { 
    public abstract void work(); 
} 

public class Secretary extends Employee { 
    public void work() { 
     //Implement here... 
    }; 
} 

ИЛИ

interface Stuff{ 
    void work(); 
} 

class Employee implements Stuff{ 

    @Override 
    public void work() { 

    } 
} 

class Secretary extends Employee { 
    public void work() {} 
} 
Смежные вопросы