2013-03-06 26 views
9

Bir Sınıf tasarlarken biraz sorun yaşıyorum.Çok özellikli bir nesne nasıl oluşturulur?

TCustomer = Class 
    private 
    FIdNumber: String; 
    FName: String; 
    procedure SetName(const Value: String); 
    procedure SetNumber(const Value: String); 
    public 
    Property Name : String read FName; 
    Property IdNumber : String read FIdNumber; 
    Constructor Create(Number, Name : String); 
end; 

constructor TCustomer.Create(ANumber, AName: String); 
begin 
    SetName(AName); 
    SetNumber(ANumber); 
end; 

MyCustomer := TCustomer.Create('1', 'John Doe'); 

Ama iyi müşterim daha özelliklere sahiptir: Müşteri Class oluşturma basit görünüyor, doğum tarihi nerede yaşadığını vs vs

ben bir kurucu ile sona Görüldüğü üzere
TCustomer = Class 
    private 
    {..snip snip..} 
    public 
    Property Name : String read FName; 
    Property IdNumber : String read FIdNumber; 
    Property Street : String read FStreet; 
    Property HouseNumber : Integer : read FHouseNumber; 
    .. 
    .. 
    .. 
    Constructor Create(Number, Name, Street : String; Housenumber : Integer .. .. ..); 
end; 

bir sürü argümanla. Bir çok özelliği olan bir nesneyi inşa etmenin daha iyi bir yolu nedir?

+4

benim ilk thoght yalnızca sınıf örneği oluşturma korumak * esansiyel * özelliklere sahip sınıf oluşturmaktır. örneğin sizin durumunuzda benzersiz bir 'Kullanıcı Kimliği 'olabilir. – kobik

+2

Durumunuzu, yeni bir DB kaydı ('insert') oluşturmaya benzetebilirsiniz. Hangi özelliklerin * gerekli olduğunu * düşünün * (bunları yapıcı argümanlarında kullanın) ve hangi özelliklerin varsayılanları var (bunları sınıf kurucunuzun içinde başlatın). – kobik

+1

, çiftinin bir dizisini alıp RTTI kullanarak, TCustomer Sınıfını ayrıştırır ve parametrelerden alan değerlerini ayarlarsınız, yani TMyCustomer.Create ([AProp ('FirstName', 'Joe'), AProp ('LastName', 'Doe'), ...]); – ComputerSaysNo

cevap

15

belli sınıf birçok alanlara sahip gerekiyorsa, sadece zorunlu parametreler ve ben yazılabilir özelliklerinde tutacak kalanı ile bir kurucu yapacak: O maruz bırakabilir eğer,

type 
    TCustomer = class 
    private 
    FName: string; 
    FIdNumber: string; 
    FStreet: string; 
    FHouseNumber: Integer; 
    public 
    // constructor is empty or just with mandatory parameters 
    constructor Create; 
    // properties are writeable 
    property Name: string read FName write FName; 
    property IdNumber: string read FIdNumber write FIdNumber; 
    property Street: string read FStreet write FStreet; 
    property HouseNumber: Integer read FHouseNumber write FHouseNumber; 
    end; 

Elbette bu bağlıdır özellikleri o kadar yazılabilir olması, ancak kullanım birçok parametre ile yapıcı daha iyi bence arar:

var 
    Customer: TCustomer; 
begin 
    Customer := TCustomer.Create; 
    Customer.Name := 'Name'; 
    Customer.IdNumber := 'ID number'; 
    Customer.Street := 'Street'; 
    Customer.HouseNumber := 12345; 
end; 
+6

+1, eğer gerekliyse, "kurucunun" birkaç yüklenmesini yapabiliriz ("kurucu boş veya yalnızca zorunlu parametrelerle") – kobik

+0

Akıcı stil özellik ayarlayıcıları, basit olsa da/ile kullanılabilir muhtemelen aynı derecede özlü ve daha güvenli bir kod sağlayacaktır –

İlgili konular