Domanda

In una lezione di base, c'è un protetto procedura. Quando eredita quella classe, voglio nascondere quella procedura dall'uscita dall'esterno. Ho provato a prepararlo dall'interno del privato e persino rigoroso privato sezioni, ma può ancora essere chiamato dall'esterno. La classe originale non è mia, quindi non posso cambiare come TOriginal è definito.

È possibile nascondere questa procedura nella mia classe ereditata? E come?

type
  TOriginal = class(TObject)
  protected
    procedure SomeProc;
  end;

  TNew = class(TOriginal)
  strict private
    procedure SomeProc; override;
  end;
È stato utile?

Soluzione

I metodi protetti sono già nascosto dall'esterno. (Principalmente; vedi sotto.) Non è possibile ridurre la visibilità di un membro della classe. Se la classe base ha dichiarato il metodo protetto, tutti i discendenti di quella classe possono utilizzare il metodo.


A Delphi, l'altro codice all'interno della stessa unità di una classe può accedere ai membri protetti di quella classe, persino codice da classi non correlate. A volte può essere utile, ma di solito per aggirare altre carenze di progettazione. Se hai qualcosa che "davvero" dovrebbe essere protetto, puoi farcela severa protetto e quindi la speciale regola di accesso della stessa unità non si applica.

Altri suggerimenti

Una volta esposto non puoi nasconderlo, ma puoi farlo per individuare dove viene chiamato in modo limite

TOriginalClass = class
public
  procedure Foo;
end;

TNewClass = class(TOriginalClass) 
public
  procedure Foo; reintroduce;
end;

implementation

procedure TNewClass.Foo;
begin
  Assert(False, 'Do not call Foo from this class');
  inherited Foo;
end;

var Obj: TNewClass;
Obj := TNewClass.Create;
Obj.Foo; // get assert message

Will not get Assert error if declared as TOriginalClass
var Obj: TOriginalClass;
Obj := TNewClass.Create;
Obj.Foo; // Never get the assert message
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top