2012-12-08 13 views
10

İç içe türlerin kapsamının neden Delphi'de türetilmiş sınıflar içermediğini merak ediyorum; o kod daha temiz yapabilir: Yanılmıyorsam eğer TBaseTest içinde TVertor yazarken bölümünü kullanır içindeYuvalanmış türlerin kapsamı türetilmiş sınıfları neden içermez?

type 
    TBaseTest = class 
    public type 
    PVector = ^TVector; 
    TVector = record 
     A, B, R: Integer; 
    end; 
    public 
    procedure Execute(var Vector: TVector); virtual; abstract; 
    end; 

    TTestA = class(TBaseTest) 
    public 
// E2003 Undeclared identifier: 'TVector' 
    procedure Execute(var Vector: TVector); override; 
// workaround: 
// procedure Execute(var Vector: TBaseTest.TVector); override; 
    end; 
+3

Geçici çözümünüzü bir geçici çözüm olarak görmem. TVektörün iki farklı sınıfın iç içe geçmiş türleri arasında nasıl ayırt edersiniz? Her ne kadar kuşkusuz ki, türetilmiş sınıflarda, temel tipin TV oynatıcısına varsayılan olarak ... –

+2

tasarımcıların belirsizlikten kaçınmak istediğini tahmin edebilirim. Belki de yıllar önce “with” ifadesiyle çalışmayı öğrendiler. –

+1

Olası çözüm, 'mühürlü' iç içe geçmiş türleri, yani türetilmiş sınıflarda yeniden bildirilemeyen türleri tanıtıyor. – kludg

cevap

0

, derleyici modüllerde sonra, o zaman bu birimde, bu sınıftaki ilk o arar. Bu yüzden, TBaseTest.TVector anlamına gelen basit bir TV çevirici yazabilirsiniz.

TBaseTest'ten türetilmiş bir sınıf TTestA yazdığınızda ve orada TV düzenleyicisini kullandığınızda, önce TTestA'da (hiç TV yürütücüsü yok), daha sonra bu modülde (TV'de yok), sonra Kullanımlar'da görünür. TBaseTest'in iç sınıfını kullanmak istiyorsanız, TVTest, TTestA'da değil, TBaseTest'te tanımlandığından, doğrudan TBaseTest.TVector yazmalısınız.

+0

Son cümle oldukça anlamsız. Soruda görünenleri tekrarlar. –

+0

Ben iç sınıflar TBaseTest.TVector ve TTestA.TVector farklı olduğu gibi, kalıtsal değil demek. – omickron

+0

Bu konuda belirtilmiştir. Soru neden tasarımın neden böyle olduğunu soruyor. –