2015-03-18 4 views
9

मुझे कोड अनुबंधों के साथ इनविरिएंट का उपयोग करते समय एक समस्या आई है। मैं अपने सार वर्ग के भीतर एक Invariant को परिभाषित करना चाहता हूं लेकिन इसे आसानी से अनदेखा किया जाता है। नीचे दिया गया कोड मेरा इंटरफ़ेस और सार वर्ग दिखाता है।कोड अनुबंध: अमूर्त वर्ग में Invariants

[ContractClass(typeof(IPointContract))] 
interface IPoint 
{ 
    int X { get; } 
    int Y { get; } 
} 

[ContractClassFor(typeof(IPoint))] 
abstract class IPointContract : IPoint 
{ 

    public int X 
    { 
     get { return 0; } 

    } 

    public int Y 
    { 
     get { return 0; } 
    } 

    [ContractInvariantMethod] 
    private void PointInvariant() 
    { 
     Contract.Invariant(X > Y); 
    } 
} 

बाद में, मैं इस प्वाइंट क्लास के भीतर इस इंटरफ़ेस को कार्यान्वित करता हूं और इससे एक ऑब्जेक्ट बनाता हूं। रनटाइम के दौरान कम से कम असफल होना चाहिए।

class Point : IPoint 
{ 
    public Point(int X, int Y) 
    { 
     this._x = X; 
     this._y = Y; 
    } 

    private int _x; 
    public int X 
    { 
     get { return _x; } 
    } 

    private int _y; 
    public int Y 
    { 
     get { return _y; } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Point p = new Point(1, 2); 
    } 
} 

जब मैं इनवेरिएंट को प्वाइंट-क्लास में ले जाता हूं, तो यह ठीक काम करता है। अन्य सभी पूर्व-या पोस्ट की स्थिति भी ठीक काम कर रही हैं।

क्या एक अमूर्त वर्ग के भीतर इनवेरिएंट होना संभव नहीं है या क्या मैं इसे गलत कर रहा हूं?

+0

आप इंटरफेस अर्थशास्त्र के साथ एक अमूर्त वर्ग का नाम क्यों दे रहे हैं? एक अमूर्त वर्ग एक इंटरफ़ेस नहीं है और I से शुरू नहीं होना चाहिए। –

+0

मैं कोड अनुबंध मैनुअल में समान अर्थशास्त्र का उपयोग कर रहा हूं। अध्याय 2.8 देखें http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf – Dynamike

+1

मुझे लगता है ... यह I-FooContract नहीं है, यह IFoo-Contract है। अगर यह मैं था, तो शायद मैं इसे स्पष्ट करने के लिए अनुबंध फोरिफ़ू लिखूंगा, लेकिन शायद यहां कुछ सम्मेलन है ... –

उत्तर

2

इनवेंटर्स इंटरफेस पर समर्थित नहीं हैं। (आपका प्रश्न शीर्षक "अमूर्त वर्ग में Invariants" है लेकिन समस्या का क्रूक्स इंटरफेस के साथ है।)

मेरा अनुमान है कि ऐसा इसलिए है क्योंकि इनवेरिएंट को राज्य की आवश्यकता होती है लेकिन इंटरफेस में राज्य नहीं होता है। मुझे यकीन है कि कोड अनुबंध टीम इस के आसपास काम कर सकती है और मेरी इच्छा है कि वे ऐसा करेंगे क्योंकि यह एक शानदार विशेषता होगी।

इस सीमा आप कर सकते थे हल करने के लिए:

  • व्युत्पन्न वर्ग (class Point, आदि) के लिए अपरिवर्तनीय विधि जोड़ें।
  • या, सार वर्ग गुणों में सेटर्स जोड़ें और सेटर्स में अनुबंध तर्क लागू करें।
संबंधित मुद्दे