Μπορώ να κοροϊδεύει ένα προστατευμένο υπερκλάση κλήση μεθόδου σε Java;

ψήφοι
1

Έχω σκόνταψε πάνω σε ένα πρόβλημα τον έλεγχο της σκωπτική μια κλήση προστατευόμενων μεθόδου από ένα σούπερ τάξη.

π.χ :

public class A extends B {
    @Override
    protected int calculate(int x, int y) {
         int result = super.calculate(x, y);
         result += 10;
         return result;
    } 
}

Έτσι, είναι δυνατόν με κάθε μέσο να κοροϊδεύει super.calcluate(x,y); Έχω δοκιμάσει με κατασκόπων, αλλά κατασκόπων δεν μπορούσε να επικαλεστεί σούπερ μέθοδο γιατί είναι έξω από το πεδίο εφαρμογής νομίζω.

Δημοσιεύθηκε 03/10/2011 στις 12:03
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
3

Θα ήθελα να φανταστώ ένα πλαίσιο σκωπτική θα επιτρέψει σε σας για να κοροϊδεύει protectedμέλη, αλλά αν πλαίσιο σκωπτική σας δεν το κάνει, έχετε σκεφτεί τη δημιουργία ενός στελέχους της τάξης;

public class AStub extends A {
    @Override
    protected int calculate(int x, int y) {
        // do stub calculation 
        return calculation;
    }
}
Απαντήθηκε 03/10/2011 στις 12:11
πηγή χρήστη

ψήφοι
3

Όταν κοροϊδεύει ένα αντικείμενο, που δεν νοιάζονται για την εφαρμογή του. Μπορείτε να προσθέσετε μόνο τις προσδοκίες για την οποία καλείται η μέθοδος.

Αν κοροϊδεύει Α, τότε οι προσδοκίες σας θα πω κάτι «Περιμένω μέθοδος υπολογίζει στην Α να ονομάζεται με παραμέτρους 2 και 3, και το αποτέλεσμα θα είναι 15».

Δεν με νοιάζει ποια είναι η μέθοδος υπολογίζει το κάνει στην πράξη, αυτό είναι το νόημα της σκωπτική.

Απαντήθηκε 03/10/2011 στις 12:12
πηγή χρήστη

ψήφοι
1

Δυστυχώς, δεν νομίζω ότι υπάρχει ένας εύκολος τρόπος για να κοροϊδεύει super.calculate.

Βλέπω ότι θέλετε να γράψετε ένα «καθαρό» δοκιμή μονάδα για το Α που δεν βασίζεται σε Β, το οποίο είναι ένα λογικό στόχο. Αλλά αν ο Α καλεί προστατευόμενη μέθοδο για την υπερκλάση της, Java καθιστά δύσκολο να αποσυνδέσει τις δύο κατηγορίες.

Αυτό είναι ένα από τα πολλά παραδείγματα όπου χρησιμοποιούν πιο στενά από ό, τι θα θέλατε τάξεις κληρονομιά ζευγάρια.

Ιδανικά Α θα τυλίξει Β παρά την επέκτασή του (δηλαδή χρησιμοποιώντας σύνθεση αντί κληρονομικότητα), και στη συνέχεια θα καλέσει myB.calculateαντί super.calculate.

Και οι δύο κατηγορίες θα μπορούσε να εφαρμόσει την ίδια διεπαφή (π.χ. να υπολογιστούν) για να μπορέσουν να αντιμετωπίζονται πολυμορφικά από τους πελάτες. Η προσέγγιση αυτή θα requre B.calculate να είναι δημόσιες, ή τουλάχιστον το πακέτο-κοινό. δοκιμή μονάδα σας θα μπορούσε να δημιουργήσει ένα Α που τυλίγει μια παρωδία Β, επίλυση με αυτόν τον τρόπο το πρόβλημά σας.

Νομίζω ότι θα πρέπει να επιλέξουν μεταξύ της αύξησης της προβολής των υπολογίσει (), όπως περιγράφεται παραπάνω, και γράφοντας ένα τεστ καθαρό μονάδα - δεν νομίζω ότι μπορείτε να έχετε και τα δύο.

Απαντήθηκε 03/10/2011 στις 13:52
πηγή χρήστη

ψήφοι
2

Δεν θα πρέπει να κοροϊδεύοντας μια κλήση σε σούπερ. Μια δοκιμή μονάδα αυτή προορίζεται να δοκιμαστεί η λειτουργικότητα μιας τάξης, και η λειτουργικότητα των κλάσεων πρόγονος είναι ένα μέρος αυτής της λειτουργικότητας .

Η μόνη φορά που θα χρειαστεί να κοροϊδεύει ένα σούπερ κατηγορία είναι όταν η τάξη πρόγονος συμπεριφέρεται άσχημα - όπως την προετοιμασία έξω από τάξεις, ως μέρος της δικής προετοιμασίας της (χωρίς την προβολή ένεση εξάρτηση) ή πρόσβαση σε εξωτερικούς πόρους (χωρίς την προβολή ένεση εξάρτηση) . Εάν έχετε πρόσβαση στην κατηγορία πρόγονο, που refactor να αφαιρέσετε αυτά τα προβλήματα.

Απαντήθηκε 03/10/2011 στις 14:08
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more