2013-02-06 12 views
6

Potrzebuję wykonać projekt z wymienionymi cechami programowania obiektowego za pomocą Java.Przykład Java z enkapsulacją, polimorfizmem i dziedziczeniem?

Czy ktoś mógłby przejrzeć mój krótki przykładowy program, aby potwierdzić, że rozumiem, w jaki sposób te cechy są wdrożone i czy wszystkie one są obecne i wykonane prawidłowo?

package Example; 

public class Parent { 

    private int a; 
    public void setVal(int x){ 
     a = x; 
    } 
    public void getVal(){ 
     System.out.println("value is "+a); 
    } 
} 

public class Child extends Parent{ 

    //private fields indicate encapsulation 
    private int b; 
    //Child inherits int a and getVal/setVal methods from Parent 
    public void setVal2(int y){ 
     b = y; 
    } 
    public void getVal2(){ 
     System.out.println("value 2 is "+b); 
    } 
    //having a method with the same name doing different things 
    //for different parameter types indicates overloading, 
    //which is an example of polymorphism 
    public void setVal2(String s){ 
     System.out.println("setVal should take an integer."); 
    } 
} 
+3

Posiadacie dziedziczenie i hermetyzację, ale nie macie żadnego polimorfizmu. Twój własny komentarz dotyczący kodu wyjaśnia, dlaczego: metoda powinna mieć tę samą nazwę. Tak nie jest. Zawsze używaj adnotacji @Override, gdy masz zamiar zastąpić metodę. –

+2

Nie wiem, czy przeciążenie jest sposobem prezentacji polimorfizmu ([prawdopodobnie nie] (http://stackoverflow.com/questions/824763/is-polymorphism-another-term- for-overloading)). Jeśli spiszę to, spróbuję przedstawić go z nadrzędnym, jak w [tym przykładzie] (http://stackoverflow.com/questions/154577/polymorphism-vs-overriding-vs-overloading). – Pshemo

+2

Nie wywołuj też metody 'getVal()', która niczego nie pobiera, ale drukuje ją zamiast niej. gettery i setery są dobrze znaną konwencją w Javie, a twoja metoda getVal() ma nazwę getter, ale nie jest. Jeśli był to getter, zwróciłby to, co zostało ustawione przez odpowiednią metodę ustawiającą ('setVal()'). –

Odpowiedz

4

Twój polimorfizm przykład jest jedynie metoda przeciążenia i że nie jest rzeczywiście to, co ludzie Object Oriented myśli przez polimorfizm. Chodzi mi o to, jak możesz mieć interfejs, który eksponuje metodę, a różne classes, które implementują tę metodę, mogą implementować metodę, aby mieć różne zachowania.

Zobacz this. W szczególności ostatni akapit wprowadzenia.

Sugeruję również, że najlepszym sposobem wykazania wiedzy o polimorfizm w kodzie byłby koniecznie kod klienta, który używa polimorficznych obiektów, aby zademonstrować, że mogą mieć różne, tj. Poli, zachowania.

+0

To sprawia, że ​​jest bardziej przejrzysty; Teraz rozumiem różnicę. Dzięki! – user2048643

4

Kilka rzeczy:

  • Getter metoda powinna zwracać wartości.
  • Przeciążanie różni się od nadpisywania. Prawdopodobnie chcesz zastąpić metodę setVal() (lub może inną bardziej odpowiednią) w twojej klasie potomnej, aby wykazać polimorfizm.

Zobacz poniższy przykład. Parent implementuje fooMethod(). Nadrzędny następnie przeciąża fooMethod() przez dodanie fooMethod (String str). Pomyśl o tym, jako o dwóch osobnych, zupełnie nie związanych ze sobą metodach - po prostu mają bardzo podobne wyglądające nazwy. Przeciążenie nie ma nic wspólnego z polimorfizmem.

Następnie dziecko rozciąga rodzica. Dziecko początkowo dziedziczy fooMethod z Parent, ale chce innej funkcjonalności, gdy wywoływana jest metoda fooMethod(). Zatem Child przesłoni metodę fooMethod() z własną implementacją. Teraz, gdy obiekt Child wywoła fooMethod(), uruchomi się wersja Child fooMethod(), wyświetlająca "pasek", a nie "foo".

public class Parent { 
    public void fooMethod() { 
    System.out.println("foo"); 
    } 

    public void fooMethod(String str) { // overloading Parent.fooMethod() 
    System.out.println("foo " + str); 
    } 
} 


public class Child extends Parent { 
    public void fooMethod() { 
    System.out.println("bar"); // overriding Parent.fooMethod() 
    } 
} 
1

Twój przykład przesłaniania jest niepoprawny (jak na przykład, nie wykazuje polimorfizmu).

wyświetlasz dwie funkcje z różnymi sygnaturami (typy argumentów są częścią sygnatury funkcji). tylko dlatego, że mają tę samą nazwę, nie czyni ich przykładem nadrzędnego.

nadrzędnym byłoby, gdyby klasa dziecko miało coś takiego

public void setVal(int x){ 
    a = x+10; 
} 

które mogłyby przesłonić (int) metody w super (dominującej) Klasa jej SETVAL.

jednak lepszy sposób, aby wykazać polimorfizm byłoby coś wzdłuż linii

Parent guy = new Child(); 
guy.getVal(); 
1
/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
class Parent_1 
{ 
    private int i;//encap 
    private int j; 

    public void display() {    
     System.out.println("these are the 2 answer"); 
    } 
} 

class child extends Parent_1 //inher 
{ 
    public void display() //method overiding 
    { 
     System.out.println("this is for method overriding"); 
    } 

    public void mul(int i, int j) 
    { 
     int k=i*j; 
     System.out.println("mul of 2 int val is:"+k); 
    } 

    public void mul(double i,double j) //poly 
    { 
     double z=i*j; 
     System.out.println("mul val of 2 double is:"+z); 
    } 
} 

class Son 
{ 
    public static void main(String args[]) 
    { 
     Parent_1 p=new Parent_1(); 

     Parent_1 pt=new child(); 
     child cd=new child(); 
     p.display(); 
     cd.mul(2, 20); 
     cd.mul(2.2, 1.1); 
     pt.display(); 
    } 
} 
Powiązane problemy