2011-04-05 9 views
52

अधिक भार कैसे मैं इस तरह सी # में कंस्ट्रक्टर्स उपयोग कर सकते हैं कंस्ट्रक्टर्स:सी #

public Point2D(double x, double y) 
{ 
    // ... Contracts ... 

    X = x; 
    Y = y; 
} 

public Point2D(Point2D point) 
{ 
    if (point == null) 
     ArgumentNullException("point"); 
    Contract.EndContractsBlock(); 

    this(point.X, point.Y); 
} 

मैं इसे की जरूरत है एक और निर्माता से कोड को कॉपी नहीं करने के लिए ...

उत्तर

55

आप अपने सामान्य तर्क को अलग कर सकते हैं एक निजी विधि के लिए, उदाहरण के लिए Initialize कहा जाता है जिसे दोनों रचनाकारों से बुलाया जाता है।

इस तथ्य के कारण कि आप तर्क सत्यापन करना चाहते हैं, आप कन्स्ट्रक्टर चेनिंग का सहारा नहीं ले सकते हैं।

उदाहरण:

public Point2D(double x, double y) 
{ 
    // Contracts 

    Initialize(x, y); 
} 

public Point2D(Point2D point) 
{ 
    if (point == null) 
     throw new ArgumentNullException("point"); 

    // Contracts 

    Initialize(point.X, point.Y); 
} 

private void Initialize(double x, double y) 
{ 
    X = x; 
    Y = y; 
} 
+13

अपरिवर्तनीयता के उत्साही प्रशंसक के रूप में, मुझे यह ध्यान रखना होगा कि इस विधि की कमी यह है कि आप केवल पढ़ने वाले फ़ील्ड को प्रारंभ नहीं कर सकते हैं :( –

+0

मैं इस सटीक समाधान के बारे में सोच रहा था, और अब आपने पुष्टि की है कि यह एक अच्छा विचार है। धन्यवाद:) – superiggy

+6

मार्क सीडाडे के पहले जवाब का प्रयास करें। फॉलबैक के रूप में इसका इस्तेमाल करें। – gidmanma

144
public Point2D(Point2D point) : this(point.X, point.Y) { } 
+0

मैं उपयोग संविदा और अशक्त-अपवाद चाहते हैं, क्योंकि यह एक व्यर्थ प्रकार के रूप में परिभाषित नहीं है, तो बिंदु रिक्त है –

+4

बिंदु नल नहीं हो सकता (Point2D? बिंदु) – RvdK

+0

यह बताएं कि आपके संविदा का उपयोग करके क्या मतलब है। मार्क का जवाब सही है। – SQLMason

5

हो सकता है कि अपने वर्ग काफी पूरा नहीं हुआ है। व्यक्तिगत रूप से, मैं अपने सभी अधिभारित रचनाकारों के साथ एक निजी init() फ़ंक्शन का उपयोग करता हूं।

class Point2D { 

    double X, Y; 

    public Point2D(double x, double y) { 
    init(x, y); 
    } 

    public Point2D(Point2D point) { 
    if (point == null) 
     throw new ArgumentNullException("point"); 
    init(point.X, point.Y); 
    } 

    void init(double x, double y) { 
    // ... Contracts ... 
    X = x; 
    Y = y; 
    } 
}