Domanda

Diciamo che ho il seguente codice:

interface ISomeInterface
{
    void DoSomething();
    void A();
    void B();    
}

public abstract class ASomeAbstractImpl : ISomeInterface
{
    public abstract void A();
    public abstract void B();
    public void DoSomething()
    {
        // code here
    }
}

public class SomeImpl : ASomeAbstractImpl 
{
    public override void A()
    {
        // code
    }

    public override void B()
    {
        // code
    }
}

Il problema è che vorrei avere il metodo ASomeAbstractImpl.DoSomething () sigillato (finale) in modo che nessun'altra classe potesse implementarlo. Poiché il codice è ora SomeImpl potrebbe avere un metodo chiamato DoSomething () e che potrebbe essere chiamato (non sovrascriverebbe il metodo con lo stesso nome dalla classe astratta, perché che non è contrassegnato come virtuale), tuttavia vorrei escludere la possibilità di implementare tale metodo nella classe SomeImpl .

È possibile?

È stato utile?

Soluzione

I metodi in C # sono sigillati per impostazione predefinita. Non esiste, tuttavia, niente che tu possa fare per evitare che il metodo venga nascosto (esponendo un metodo con lo stesso nome nella classe derivata, comunemente con new ).

O, del resto, reimplementazione dell'interfaccia:

static void Main()
{
    ISomeInterface si = new EvilClass();
    si.DoSomething(); // mwahahah
}

public class EvilClass : ASomeAbstractImpl, ISomeInterface
{
    public override void A() {}
    public override void B() { }
    void ISomeInterface.DoSomething()
    {
        Console.WriteLine("mwahahah");            
    }
}

Altri suggerimenti

Tutti i metodi sono sigillati per impostazione predefinita, ma non c'è modo di impedire l'occultamento dei membri.

Il compilatore C # emetterà un avviso del compilatore ogni volta che nascondi un membro, ma a parte questo, non puoi impedirlo.

Un metodo che non è contrassegnato come virtuale è sigillato per impostazione predefinita. In una classe derivata devi contrassegnare una "sostituzione" " con la parola chiave nuova , altrimenti riceverai un avviso del compilatore. Se il metodo della superclasse è contrassegnato come virtuale, puoi sigillarlo per override sigillato .

http://msdn.microsoft.com/ it-it / library / aa645769 (VS.71) aspx

se la classe SomeImpl contiene il metodo DoSemthing, ciò significa che nasconde quello originale non sovrascrivendolo.

Quando si ha a che fare con interfacce e classi astratte, si tratta più di ciò che DEVI fare e non di ciò che non puoi fare. Quindi puoi far sapere all'utente dell'interfaccia che questi sono i metodi che devono implementare e con le tue classi astratte puoi usare la parola chiave virtuale per far loro sapere che è OK per sovrascrivere un metodo. Tuttavia non puoi impedire loro di fare troppo. Anche se non usi intenzionalmente la parola chiave virtuale , possono comunque nasconderla con la nuova parola chiave .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top