2009-11-18 24 views
14
Ben

Delphi/Pascal: Farklı bir prototip ile bir kurucu aşırı

  1. ile belirli durumlar için özel bir yapıcısı TForm bir çocuk sınıfı oluşturmak çalışıyorum

    ve

  2. uyumluluk sağlar varsayılan bir kurucu mevcut kod ile.

    interface 
        TfrmEndoscopistSearch = class(TForm) 
        public 
        /// original constructor kept for compatibility 
        constructor Create(AOwner : TComponent); overload; override; 
        /// additional constructor allows for a caller-defined base data set 
        constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); overload; 
        end; 
    

    Bu iş gibi görünüyor, ama her zaman derleyici uyarı alıyorum:

Bu Şimdi sahip kodudur

 
[Warning] test.pas(44): Method 'Create' hides virtual method of base type 'TCustomForm' 
  • ekleme "aşırı;" ikinci kurucudan sonra derleme yapmaz. "[Error] test.pas (44): 'Oluştur' beyanı önceki beyannameden farklıdır".
  • İkinci yapıcıyı bir sınıf işlevi herhangi bir hata veya uyarı olmadan derler ancak çalışma zamanında bir erişim ihlali ile ölür (tüm üye variller sıfırdır). Bu gibi ikinci overload önce reintroduce ekleyerek

cevap

16

Dene:

TfrmEndoscopistSearch = class(TForm) 
    public 
    /// original constructor kept for compatibility 
    constructor Create(AOwner : TComponent); overload; override; 
    /// additional constructor allows for a caller-defined base data set 
    constructor Create(AOwner : TComponent; ADataSet : TDataSet; ACaption : string = ''); reintroduce; overload; 
    end; 

Bu Turbo Delphi derler. published yöntemlerinin aşırı yüklenmesi kısıtlı olduğundan, derlenmesini sağlamak için public'a ihtiyacım vardı.

+0

bango! "Yeniden" anahtar kelimesi tam olarak ihtiyaç duyulan şeydir. Orijinal kurucu da gereklidir, çünkü veri kümesini uygun varsayılan değere ayarlar. –

26

Bundan kaçınmanın gerçekten kolay bir yolu var. Yeni kurucunuza farklı bir ad verin. Diğer popüler dillerden farklı olarak, Delphi isimli yapıcı; Onları Aramak zorunda değilsiniz. Yeni bir CreateWithDataset'i arayabilir ve sanal Create yapıcısına hiç müdahale etmeyebilirsiniz.

TfrmEndoscopistSearch = class(TForm) 
    /// original constructor kept for compatibility 
    constructor Create(AOwner: TComponent); override; 
    /// additional constructor allows for a caller-defined base data set 
    constructor CreateWithDataset(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = ''); 
end; 

Aslında, bu sınıfı polimorfik olarak başlatmıyorsanız, orijinal kurucuya bile ihtiyacınız yoktur. Bir derleme hatası doğuracak doğrudan TfrmEndoscopistSearch üzerinde tek argüman kurucusunu çağırmak için çalışılıyor

TfrmEndoscopistSearch = class(TForm) 
    /// additional constructor allows for a caller-defined base data set 
    constructor Create(AOwner: TComponent; ADataSet: TDataSet; ACaption: string = ''); reintroduce; 
end; 

: Bu gibi yenisini bildirebilirsiniz.


(genellikle Application.CreateForm kullanmanızı gerektirir polymorphically bunu Oluşturma:. Paranın ana form olmadığı sürece her zaman TComponent tanıtılan tek argüman sanal yapıcı çağrıları

Application.CreateForm(TfrmEndoscopistSearch, frmEndoscopistSearch); 

, sana ihtiyacım yok Bunun için. Daha önce yaklaşık my feelings on Application.CreateForm yazdım.)

+0

Bu muhtemelen en uygun çözümdür, ancak sorunun cevabı değildir.Alıştırmanın bir parçası sorunu düzeltmek ve zaten bir veya başka bir create() biçimini kullanan diğer 10 veya daha fazla dosyayı değiştirmek zorunda kalmamaktır. Bu formu iki farklı projeden bir araya getiriyorum ve çatallamak istemedim. –

6
constructor Create(AOwner:Tcomponent;str:string);overload; 
... 
constructor TfrmEndoscopistSearch.Create(AOwner: Tcomponent; str: string); 
    begin 
    inherited Create(AOwner); 
    showmessage(str); 
    end; 

Bu hile yapmak gerekir

İlgili konular