2011-02-15 16 views
6

Örneğin, bir nesnenin bir dosya yolu kullanarak ve bir dize kullanarak iki şekilde başlamasını isteyebilirsiniz. Normalde her iki kurucu da bir dize parametresi almalı, MyObject(string file) ve MyObject(string content), ancak bu şekilde aşırı yüklenme imkansızdır. Sen ne önerirsin?İki kurucu aşırı yüklenme nasıl oluşturulur, her ikisi de yalnızca bir dize parametresi mi alıyor?

Edit: İlk durumda, dosya yoluna da ihtiyaç vardır, bu nedenle lütfen dosya içeriğini okuyan ve içeriği diğer kurucuya ileten bir çözüm önermeyin.

+2

Dize türlerinden birini kendi sınıfında sarmalayın ve bu türünü bunun yerine bir parametre olarak kabul edin. –

+0

@Cody Grey: Merhaba, bunun bir cevap olduğunu düşünüyorum. –

+0

Cevap olarak göndermedim, çünkü Mark Byers tarafından sağlananın bu durumda en iyi çözüm olduğunu düşünüyorum. (Bunun yerine onu bıktım.) Bunun yerine iş yapacak bir tür var olduğunda ek bir sarıcı sınıf oluşturmak için bir sebep yok. Daha genel uygulamalar için önerim muhtemelen gitmek için bir yoldur. –

cevap

10

Belki ilk kabul değişebilir bir FileInfo yerine:

class MyObject 
{ 
    public MyObject(FileInfo file) { /* etc... */ } 
    public MyObject(string content) { /* etc... */ } 
} 

... 

MyObject o = new MyObject(new FileInfo(filename)); 
+0

Veya daha genel olarak, bir sarın kendi sınıfında dize türleri ve bu tür bir parametre olarak kabul ediyorum (bu durumda sarıcı FileInfo olduğunu) –

15

Bir C# programcı değilim ama bu static factory method model için bir işe benziyor: Sonra

class MyObject { 
    public static MyObject FromContent(string content) { 
    return new MyObject(content); 
    } 

    public static MyObject FromFile(string path) { 
    return new MyObject(ReadContentFromFile(path)); 
    } 
} 

seni Kullanmadan daha okunaklı olan

düzenli bir kurucu.

+0

parlak akıllar ... ikinci durumda, yine de kaybedeceğim yoluna ihtiyacım var, –

+0

bu deseni kullan. –

+0

Bu problemi zaten biliyorsunuz değil mi? MyObject.GetPath(), MyObject bir yoldan oluşturulmamışsa null döndüren neden yok? – sjr

1

Veya yaratmak fabrika yöntemleri:

public static MyObject CreateByFilePath(string path){ ... } 
public static MyObject CreateByContent(string content){ ... } 
1

Belki bir fabrika kullanabilir?

class MyObjectProvider 
{ 
    public static MyObject CreateByPath(string path) 
    { 
     return new MyObject 
       { 
        Path = path; 
       }; 

    } 

    public static MyObject CreateByContent(string content) 
    { 
     return new MyObject 
       { 
        Content = content; 
       }; 
    } 
} 
0
public MyObject(Uri fileUri); 
public MyObject(string content); 
0

Ben Karşıt yaklaşım ve bunu yapmayın söylerim. Şimdiye kadar yayınlanan çözümlerin en iyisi (FileInfo veya Uri gibi aşırı yüklenmelerden biri için alternatif bir tip kullan) bana biraz hevesli geliyor - en az sürpriz ilkesine aykırı.

İçeriği yalnızca bir dosya adı olmadan kullanarak yapılandırabiliyorsanız, dosya adının gerekli olmadığını izler. Ve benzer şekilde, eğer sadece bir dosya ismi ile inşa ederseniz, içeriğin gerekli olmadığını izler. Daha sonra, daha sonra eksik dosya adını/içeriğini daha sonra ayarlayabilirsiniz.

MyObject myObject = new MyObject(fileName); 
myObject.Content = ... 

MyObject myObject = new MyObject(content); 
myObject.FileName = ... 

Yerine sorunla mücadelede, en önemli (aşağıdaki örnekte fileName) olarak da parametrelerden birini seçin ve aşağıdaki gibi iki constructurs oluşturmak: Bir özelliğini ayarlayarak

public MyObject(string fileName) : this(fileName, null) 
{ 
} 

public MyObject(string fileName, string content) 
{ 
    ... implementation 
} 

Anlamsızsa, null ya da her iki parametre için geçirilmesine izin verebilirsiniz. Ve o uygun olmadığını en az bir boş olmadığını ısrar edebilirsiniz:

public MyObject(string fileName, string content) 
{ 
    if (fileName == null && content == null) throw new ArgumentException(...); 
    ... 
}  

Kısacası, bu gibi kısıtlamaların geçici için küçük numaralar kullanmayın.

İlgili konular