Απόκρυψη κληρονόμησε μέλη

ψήφοι
34

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

Αυτές οι κατηγορίες είναι όλοι οι έλεγχοι που έχουν γραφτεί για να συνταχθεί είτε για WPF ή το Silverlight 2.0. Ξέρω για ICustomTypeDescriptorκαι ICustomPropertyProvider, αλλά είμαι αρκετά σίγουρος εκείνους που δεν μπορούν να χρησιμοποιηθούν σε Silverlight.

Δεν είναι τόσο πολύ ένα λειτουργικό θέμα ως ζήτημα χρηστικότητα. Τι πρέπει να κάνω?

Εκσυγχρονίζω

Μερικές από τις ιδιότητες που θα ήθελα πραγματικά να κρύψει προέρχονται από προγόνους που δεν είναι δική μου, και λόγω ενός ειδικού εργαλείου είμαι σχεδιασμό για, δεν μπορώ να κάνω μέλος κρύβεται με το newχειριστή. (Ξέρω, αυτό είναι γελοίο)

Δημοσιεύθηκε 04/08/2008 στις 20:13
πηγή χρήστη
Σε άλλες γλώσσες...                            


8 απαντήσεις

ψήφοι
32

Παράκαμψη τους όπως ο Michael προτείνει παραπάνω και να αποτρέψει τους λαούς από τη χρήση του παρακαμφθεί μεθόδους, επισημάνετε ως άνευ αντικειμένου (sp?):

[Obsolete("These are not supported in this class.", true)]
public override  void dontcallmeanymore()
{
}

Εάν η δεύτερη parm έχει οριστεί σε true, ένα σφάλμα compiler θα δημιουργηθεί αν κάποιος προσπαθεί να καλέσει τη μέθοδο αυτή και το string στο πρώτο parm είναι το μήνυμα. Αν parm2 είναι ψευδής μόνο μια προειδοποίηση compiler θα δημιουργηθεί.

Απαντήθηκε 04/08/2008 στις 21:14
πηγή χρήστη

ψήφοι
16

Παρόλο που δεν μπορεί να εμποδίσει τη χρήση αυτών των κληρονόμησε μέλη τις γνώσεις μου, θα πρέπει να είναι σε θέση να τους κρύψουν από IntelliSense χρησιμοποιώντας το EditorBrowsableAttribute :

Using System.ComponentModel;

[EditorBrowsable(EditorBrowsableState.Never)]
private string MyHiddenString = "Muahahahahahahahaha";

Επεξεργασία: Απλά είδα αυτό στα σχόλια τεκμηρίωσης, το οποίο το καθιστά κάπως άχρηστο για το σκοπό αυτό:

Υπάρχει μια εξέχουσα σημείωση που αναφέρει ότι αυτό το χαρακτηριστικό «δεν καταστέλλει μέλη από μια τάξη στην ίδια συνέλευση». Αυτό είναι αλήθεια, αλλά δεν είναι πλήρης. Στην πραγματικότητα, το χαρακτηριστικό δεν καταστέλλει μέλη από μια τάξη στο ίδιο διάλυμα.

Απαντήθηκε 04/08/2008 στις 20:19
πηγή χρήστη

ψήφοι
13

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

Ετσι:

public class MyClass : BaseClass
{
    // Your stuff here
}

γίνεται:

public class MyClass
{
    private BaseClass baseClass;

    public void ExposeThisMethod()
    {
        baseClass.ExposeThisMethod();
    }
}

Ή:

public class MyClass
{
    private BaseClass baseClass;

    public BaseClass BaseClass
    {
        get
        {
            return baseClass;
        }
    }
}
Απαντήθηκε 04/08/2008 στις 20:22
πηγή χρήστη

ψήφοι
8

Νομίζω ότι είσαι καλύτερος τουλάχιστον hackish τρόπος είναι να εξετάσει τη σύνθεση, σε αντίθεση με την κληρονομικότητα.

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

Απαντήθηκε 04/08/2008 στις 20:19
πηγή χρήστη

ψήφοι
3

Για να αποκρύψετε πλήρως και το σήμα να μην χρησιμοποιείτε, συμπεριλαμβανομένων intellisense η οποία πιστεύω ότι είναι αυτό που περιμένουν οι περισσότεροι αναγνώστες ...

[Obsolete("Not applicable in this class.")] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
Απαντήθηκε 24/06/2013 στις 20:50
πηγή χρήστη

ψήφοι
3

Ξέρω ότι έχει υπάρξει πολλές απαντήσεις σε αυτό, και είναι αρκετά παλιά τώρα, αλλά η πιο απλή μέθοδος για να γίνει αυτό είναι ακριβώς αυτές δηλώνουν ως new private.

Εξετάστε ένα παράδειγμα Είμαι σήμερα εργάζονται σε, όπου έχω ένα API που διαθέτει κάθε μεθόδου σε ένα 3rd party DLL. Πρέπει να πάρω τις μεθόδους τους, αλλά θέλω να χρησιμοποιήσω ένα ακίνητο .Net, αντί μιας και η μέθοδος «getThisValue» «setThisValue». Έτσι, θα οικοδομήσουμε μια δεύτερη κατηγορία, κληρονομούν την πρώτη, κάνει μια ιδιότητα που χρησιμοποιεί το πάρει και να ρυθμίσετε τις μεθόδους, και στη συνέχεια να παρακάμψετε την αρχική πάρει και να ορίσετε μεθόδους και ιδιωτικές. Είναι ακόμα διαθέσιμες σε οποιονδήποτε θέλει να χτίσει κάτι διαφορετικό σε αυτά, αλλά αν απλά θέλετε να χρησιμοποιήσετε τη μηχανή Χτίζω, τότε θα είναι σε θέση να χρησιμοποιούν τις ιδιότητες αντί των μεθόδων.

Χρησιμοποιώντας τη μέθοδο του διπλού τάξη παίρνει απαλλαγούμε από τυχόν περιορισμούς για να είναι σε θέση να χρησιμοποιήσει την newδήλωση για να κρύψει τα μέλη. Μπορείτε απλά δεν μπορεί να χρησιμοποιήσει overrideεάν τα μέλη επισημανθεί ως εικονική.

public class APIClass
{
    private static const string DllName = "external.dll";

    [DllImport(DllName)]
    public extern unsafe uint external_setSomething(int x, uint y);

    [DllImport(DllName)]
    public extern unsafe uint external_getSomething(int x, uint* y);

    public enum valueEnum
    {
        On = 0x01000000;
        Off = 0x00000000;
        OnWithOptions = 0x01010000;
        OffWithOptions = 0x00010000;
    }
}

public class APIUsageClass : APIClass
{
    public int Identifier;
    private APIClass m_internalInstance = new APIClass();

    public valueEnum Something
    {
        get
        {
            unsafe
            {
                valueEnum y;
                fixed (valueEnum* yPtr = &y)
                {
                    m_internalInstance.external_getSomething(Identifier, yPtr);
                }
                return y;
            }
        }
        set
        {
            m_internalInstance.external_setSomething(Identifier, value);
        }
    }

    new private uint external_setSomething(int x, float y) { return 0; }
    new private unsafe uint external_getSomething(int x, float* y) { return 0; }
}

Τώρα valueEnum είναι διαθέσιμο σε δύο τάξεις, αλλά μόνο η ιδιοκτησία είναι ορατή στην κατηγορία APIUsageClass. Η κατηγορία APIClass είναι ακόμα διαθέσιμα για τους ανθρώπους που θέλουν να επεκτείνουν το αρχικό API ή να το χρησιμοποιήσετε με διαφορετικό τρόπο, και η APIUsageClass είναι διαθέσιμη για όσους θέλουν κάτι πιο απλό.

Σε τελική ανάλυση, αυτό που θα κάνω είναι να καταστεί η APIClass εσωτερική και εκθέτουν μόνο κληρονόμησε τάξη μου.

Απαντήθηκε 08/12/2010 στις 21:54
πηγή χρήστη

ψήφοι
1

Θα δοκιμαστεί το σύνολο των προτεινόμενων λύσεων και στην πραγματικότητα δεν κρύβουν τα νέα μέλη.

Αλλά αυτό που κάνει:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new string MyHiddenProperty
{ 
    get { return _myHiddenProperty; }
}

Αλλά σε κώδικα behide είναι ακόμα προσβάσιμο, ώστε να προσθέσετε και Ξεπερασμένα Χαρακτηριστικό

[Obsolete("This property is not supported in this class", true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new string MyHiddenProperty
{ 
    get { return _myHiddenProperty; }
}
Απαντήθηκε 23/05/2012 στις 11:19
πηγή χρήστη

ψήφοι
0

Μπορείτε να χρησιμοποιήσετε μια διεπαφή

    public static void Main()
    {
        NoRemoveList<string> testList = ListFactory<string>.NewList();

        testList.Add(" this is ok ");

        // not ok
        //testList.RemoveAt(0);
    }

    public interface NoRemoveList<T>
    {
        T this[int index] { get; }
        int Count { get; }
        void Add(T item);
    }

    public class ListFactory<T>
    {
        private class HiddenList: List<T>, NoRemoveList<T>
        {
            // no access outside
        }

        public static NoRemoveList<T> NewList()
        {
            return new HiddenList();
        }
    }
Απαντήθηκε 13/11/2017 στις 00:24
πηγή χρήστη

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