2016-03-30 4 views
-1

Ich versuche ein Programm zu erstellen, das eine Liste der Schüler nach ihren Gesamtnoten erstellt. Wenn die Gesamtnote von zwei Schülern gleich ist, werden einzelne Noten verschiedener Fächer geprüft.Wie ruft man eine Subclass-Methode aus einer Superclass-Methode auf?

in Zeile 40 Ich versuche, eine Unterklasse-Methode aus einer Superklassenmethode Definition aufrufen, aber ich bekomme einen Fehler.

import java.util.*; 


class Student{ 
int[] ph, ch, ma; 
int[] total; 
int[] total_sort; 

Student(){} 

// length of array and marks are received via constructor. 
Student(int x, int[] p, int[] c, int[] m){ 

    // an array of p,c,m along with 2 arrays of total marks is made. 
    total = new int[x]; 
    total_sort = new int[x]; 
    ph = new int[x]; 
    ch = new int[x]; 
    ma = new int[x]; 
    for(int i = 0; i < x; i++){ 
     ph[i] = p[i]; 
     ch[i] = c[i]; 
     ma[i] = m[i]; 
     total[i] = (p[i] + c[i] + m[i]); 
     total_sort[i] = total[i]; 
    } 

} 

// sorts the array accoring to the total marks 
void Sort(){ 

    for(int f = 0; f < total.length; f++){ 

     if(total[f] > total[f+1]) 
      total_sort[f] = total[f]; 

     // checks for higher maths marks. 
     else if(total[f] == total[f+1]){ 
      int m = Stud_new.mSort(f); 
      total_sort[f] = total[m]; 
     } 

    } 
} 

/* returns the index from original total array so as to identify the   students' name. 
* marks from sorted array are compared with original array to find the index of marks in originial array . 
* this index is used to find the students' name. 
*/ 
int GetList(int a){ 


     for(int j = 0; j < total.length; j++){ 

      if(total[j] == a) 
       return j; 
     } 


    return -1 ; 

} 

}

class Stud_new extends Student{ 

int cSort(int ci){ 
    if(ch[ci] > ch[ci + 1]) 
     return ci; 

    else if(ch[ci] < ch[ci + 1]) 
     return (ci + 1); 

    //else if(ph[pi] == ph[pi + 1]) 
     //csort(pi); 
} 

int pSort(int pi){ 

    if(ph[pi] > ph[pi + 1]) 
     return pi; 

    else if(ph[pi] < ph[pi + 1]) 
     return (pi + 1); 

    else if(ph[pi] == ph[pi + 1]) 
     return(cSort(pi)); 
} 

int mSort(int mi){ 

    if(ma[mi] > ma[mi + 1]) 
     return mi; 

    else if(ma[mi] < ma[mi + 1]) 
     return (mi + 1); 

    // checks higher phy marks 
    else if(ma[mi] == ma[mi + 1]) 
     return(pSort(mi)); 
} 

}

class Mlist{ 

public static void main(String args[]){ 

    // initializes the names and marks. 
    String[] name = {"foo", "bar", "baz"}; 
    int[] phy = {80,112,100}; 
    int[] chem = {100,120,88}; 
    int[] maths = {40, 68,60}; 

    Student stud = new Student(name.length, phy, chem, maths); 

    System.out.println("Name\tPhysics\tChemistry\tMaths\tName"); 

    // prints the merit list 
    for(int i = 0; i < name.length; i++){ 

     // index of name is received by a function call 

     /* STUD.TOTAL_SORT[i] IS STUDENTS' MARKS IN SORTED MANNER. 
     * THIS IS PASSED AS AN ARGUMENT TO GETLIST METHOD WHICH USES LINEAR SEARCH 
     * TO FIND THE INDEX IN THE ARRAY OF NAMES FOR THE STUDENT WHOSE MARKS IS PASSES 
     * THE FUNCTION RETURNS INT WHICH IS THE INDEX FOR NAME[] ARRAY. and others all well. 
     * HERE STUD.TOTAL_SORT[I] IS AN ARGUMENT TO THE FUNCTION STUD.GETLIST() WHICH RETURNS AN INT    
     */ 
      System.out.println(name[stud.GetList(stud.total_sort[i])]+"\t"+phy[stud.GetList(stud.total_sort[i])]+"\t"+chem[stud.GetList(stud.total_sort[i])]+"\t"+maths[stud.GetList(stud.total_sort[i])]+"\t"+stud.total_sort[i]); 
    } 


} 

}

+0

40. Zeile ist '// set nu' – Kent

+0

[Link] (http://pastebin.com/VAeCRX4X) @Kent – shiwchiz

+0

Ich glaube, Ihr Problem ist in' Stud_new.mSort (f) '. Sie versuchen, einen statischen Aufruf auf einer nicht statischen Methode auszuführen. – dambros

Antwort

0

Sie sind wahrscheinlich für eine Factory-Methode Muster-artige Lösung suchen. Bitte googlen Sie es für weitere Details, aber einfach gesagt, möchten Sie die Student Klasse abstrakt sein und die abstrakte mSort Methode hinzufügen, und implementieren Sie dann die Methode in der Stud_new Klasse. Dann müssen Sie das Objekt Stud_new instanziieren.

Hinweis: Sie etwas tun können:

Student stud = new Stud_new(name.length, phy, chem, maths); 

Es ist bei weitem nicht perfekt Lösung, aber diese Lösung können Sie eine Methode aus der Unterklasse in Oberklasse aufrufen, die genau das, was Sie gefragt.

+0

okay ich schätze ich habe was du versuchst zu sagen! – shiwchiz

0

Das Aufrufen einer Unterklassenmethode aus einer Superklassenmethode ist nicht möglich und auch falsch.

Dies ist gegen Vererbungsregeln.

Eine Superklasse repräsentiert ein allgemeines Verhalten, während Unterklassen spezifische Verhaltensweisen aufweisen, die für ihre Superklasse nicht sichtbar sind.