2008-09-29 18 views
30

में ओवरलोडेड ऑपरेटर बाधा के लिए समाधान यदि मैं एक सामान्य विधि चाहता हूं जो केवल ऑपरेटर को अधिभारित करने वाले प्रकारों को स्वीकार करता है, उदाहरण के लिए घटाव ऑपरेटर। मैंने इंटरफ़ेस को बाधा के रूप में उपयोग करने का प्रयास किया लेकिन इंटरफेस में ऑपरेटर ओवरलोडिंग नहीं हो सकती है।.NET जेनेरिक

इसे प्राप्त करने का सबसे अच्छा तरीका क्या है?

+1

आप का एक उदाहरण है जहाँ आप कोशिश कर रहे हैं इसका उपयोग करने के लिए? मैं कहीं भी नहीं सोच सकता कि उपयोगी होगा? –

+0

एक सामान्य "योग" विधि एक साधारण उदाहरण होगा। टी Sum (IENumerable अनुक्रम); // जहां टी में '+' ऑपरेटर – blackwing

+0

संभावित डुप्लिकेट है [एक जेनेरिक परिभाषित करें जो + ऑपरेटर लागू करता है] (http://stackoverflow.com/questions/3598341/define-a-generic-that-implements-the-operator) – Timwi

उत्तर

37

कोई तत्काल उत्तर नहीं है; ऑपरेटरों स्थिर हैं, और बाधाओं में व्यक्त नहीं किया जा सकता है - और मौजूदा प्राइमेटिव किसी भी विशिष्ट इंटरफेस को लागू नहीं करते हैं (आईसीओपरपेबल [< टी >] के विपरीत] जिसका उपयोग अधिक से कम/कम अनुकरण करने के लिए किया जा सकता है)।

हालांकि; अगर आप सिर्फ यह काम करना चाहते हैं, तो .NET 3.5 में वहाँ कुछ विकल्प हैं ...

मैं एक साथ डाल दिया है एक पुस्तकालय here कि जेनरिक के साथ ऑपरेटरों के लिए कुशल और सरल उपयोग की अनुमति देता - जैसे:

T result = Operator.Add(first, second); // implicit <T>; here 

यह सी # 4.0 में, MiscUtil

इसके अतिरिक्त के हिस्से के रूप में डाउनलोड किया जा सकता है, यह dynamic के माध्यम से संभव हो जाता है:

static T Add<T>(T x, T y) { 
    dynamic dx = x, dy = y; 
    return dx + dy; 
} 

मेरे पास एक .NET 2.0 संस्करण भी था (लेकिन एक बिंदु पर), लेकिन यह कम परीक्षण किया गया है। दूसरा विकल्प

interface ICalc<T> 
{ 
    T Add(T,T)() 
    T Subtract(T,T)() 
} 

आदि के रूप में इस तरह के एक इंटरफेस बनाने के लिए है, लेकिन फिर आप सभी तरीकों, जो गंदा हो जाता है के माध्यम से एक ICalc<T>; पारित करने के लिए की जरूरत है।

+0

मुझे .NET 4.0 में गतिशील उपयोग करने की क्षमता पसंद है, यह सुनिश्चित करता है कि चीजें बहुत आसान बनाती हैं। हालांकि, यह इंगित करने लायक है कि इसका उपयोग करने पर एक प्रदर्शन निहितार्थ होगा क्योंकि इसे रनटाइम पर और अधिक काम करना है। मुझे यह जानने में दिलचस्पी होगी कि इसका कितना प्रभाव है, मुझे कुछ बेंचमार्किंग की ज़रूरत है। –

+0

बेंचमार्क पहले से ही किया गया है; यहां से कोड आज़माएं: http://social.msdn.microsoft.com/Forums/en-US/vs2010ctpvbcs/thread/287db1b9-c135-40bc-a1c5-a8a51efbfc65 –

+0

मैंने आपकी लाइब्रेरी (.NET 3.5 के लिए) की कोशिश की, और मेरे पास एक प्रश्न है: निम्न पंक्ति क्यों काम नहीं करती है: MiscUtil.Operator.Add ("ए", "बी"); मेरी समझ में, इसे "एबी" वापस करना चाहिए। – Malki

5

मुझे पता चला कि आईएल वास्तव में इसे काफी अच्छी तरह से संभाल सकता है। पूर्व।

ldarg.0 
ldarg.1 
add 
ret 

एक सामान्य विधि में संकलित, कोड तब तक ठीक चल जाएगा जब तक कि एक आदिम प्रकार निर्दिष्ट नहीं होता है। गैर-आदिम प्रकारों पर कॉल ऑपरेटर कार्यों को कॉल करना संभव हो सकता है।

here देखें।

-1

इंटरनेशनल से चुराए गए कोड का एक टुकड़ा है जिसे मैं इसके लिए बहुत उपयोग करता हूं। यह IL मूल अंकगणितीय ऑपरेटरों का उपयोग या निर्माण करता है। यह सब Operation<T> जेनेरिक क्लास के भीतर किया जाता है, और आपको केवल एक प्रतिनिधि को आवश्यक ऑपरेशन असाइन करना है। add = Operation<double>.Add की तरह।

यह इस तरह प्रयोग किया जाता है: पेस्ट बिन की

public struct MyPoint 
{ 
    public readonly double x, y; 
    public MyPoint(double x, double y) { this.x=x; this.y=y; } 
    // User types must have defined operators 
    public static MyPoint operator+(MyPoint a, MyPoint b) 
    { 
     return new MyPoint(a.x+b.x, a.y+b.y); 
    } 
} 
class Program 
{ 
    // Sample generic method using Operation<T> 
    public static T DoubleIt<T>(T a) 
    { 
     Func<T, T, T> add=Operation<T>.Add; 
     return add(a, a); 
    } 

    // Example of using generic math 
    static void Main(string[] args) 
    { 
     var x=DoubleIt(1);    //add integers, x=2 
     var y=DoubleIt(Math.PI);  //add doubles, y=6.2831853071795862 
     MyPoint P=new MyPoint(x, y); 
     var Q=DoubleIt(P);    //add user types, Q=(4.0,12.566370614359172) 

     var s=DoubleIt("ABC");   //concatenate strings, s="ABCABC" 
    } 
} 

Operation<T> स्रोत कोड सौजन्य: http://pastebin.com/nuqdeY8z

नीचे निरुपण के साथ:

/* Copyright (C) 2007 The Trustees of Indiana University 
* 
* Use, modification and distribution is subject to the Boost Software 
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 
* http://www.boost.org/LICENSE_1_0.txt) 
* 
* Authors: Douglas Gregor 
*   Andrew Lumsdaine 
*   
* Url:  http://www.osl.iu.edu/research/mpi.net/svn/ 
* 
* This file provides the "Operations" class, which contains common 
* reduction operations such as addition and multiplication for any 
* type. 
* 
* This code was heavily influenced by Keith Farmer's 
* Operator Overloading with Generics 
* at http://www.codeproject.com/csharp/genericoperators.asp 
* 
* All MPI related code removed by ja72. 
*/ 
+0

शीर्ष उत्तर पहले से ही इस दृष्टिकोण का उपयोग कर वर्णन करता है। – Servy

+0

ओह, मैंने केवल 'गतिशील' कीवर्ड समाधान देखा। – ja72

संबंधित मुद्दे