मान लीजिए मैं निम्नलिखित के साथ एक पुस्तकालय लिखें:क्या किसी अन्य प्रकार से परिवर्तनीय होने के लिए एक प्रकार पैरामीटर के लिए एक सामान्य बाधा निर्दिष्ट करना संभव है?
public class Bar { /* ... */ }
public class SomeWeirdClass<T>
where T : ???
{
public T BarMaker(Bar b)
{
// ... play with b
T t = (T)b
return (T) b;
}
}
बाद में, मैं उपयोगकर्ताओं को अपने स्वयं प्रकार जो बार के लिए परिवर्तनीय हैं परिभाषित करने और SomeWeirdClass 'कारखाना' का उपयोग करके अपनी लाइब्रेरी का उपयोग करने की उम्मीद है।
public class Foo
{
public static explicit operator Foo(Bar f)
{
return new Bar();
}
}
public class Demo
{
public static void demo()
{
Bar b = new Bar();
SomeWeirdClass<Foo> weird = new SomeWeirdClass<Foo>();
Foo f = weird.BarMaker(b);
}
}
अगर मैं where T : Foo
निर्धारित करते हैं लेकिन समस्या यह है कि मैं लाइब्रेरी की संकलन समय पर फू के बारे में पता नहीं है, और मैं वास्तव में चाहते हैं और अधिक where T : some class that can be instantiated, given a Bar
की तरह कुछ इस संभव है है इस संकलन होगा? मेरे सीमित ज्ञान से ऐसा प्रतीत नहीं होता है, लेकिन .NET ढांचे और उसके उपयोगकर्ताओं की सरलता मुझे आश्चर्यचकित करती है ...
यह static interface methods के विचार से संबंधित हो सकता है या नहीं - कम से कम, मैं देख सकता हूं कारखाने के तरीकों की उपस्थिति वस्तुओं
संपादित (एक ही तरीका है कि आप पहले से ही प्रदर्शन कर सकते हैं where T : new()
के समान) बनाने के लिए निर्दिष्ट करने के लिए सक्षम किया जा रहा में मूल्य: - निक और bzIm करने के लिए धन्यवाद - समाधान अन्य पाठकों के लिए मैं हूँ एक पूर्ण समाधान प्रदान करें क्योंकि मैं इसे समझता हूं: संपादन 2: इस समाधान के लिए सार्वजनिक डिफ़ॉल्ट कन्स्ट्रक्टर का पर्दाफाश करने के लिए Foo की आवश्यकता है। यहां तक कि
स्टूपर
बेहतर समाधान के लिए इस पोस्ट के बहुत नीचे देखने की आवश्यकता नहीं है।
public class Bar {}
public class SomeWeirdClass<T>
where T : IConvertibleFromBar<T>, new()
{
public T BarMaker(Bar b)
{
T t = new T();
t.Convert(b);
return t;
}
}
public interface IConvertibleFromBar<T>
{
T Convert(Bar b);
}
public class Foo : IConvertibleFromBar<Foo>
{
public static explicit operator Foo(Bar f)
{
return null;
}
public Foo Convert(Bar b)
{
return (Foo) b;
}
}
public class Demo
{
public static void demo()
{
Bar b = new Bar();
SomeWeirdClass<Foo> weird = new SomeWeirdClass<Foo>();
Foo f = weird.BarMaker(b);
}
}
EDIT2: समाधान 2: एक प्रकार कनवर्टर कारखाना बनाएं उपयोग करने के लिए:
#region library defined code
public class Bar {}
public class SomeWeirdClass<T, TFactory>
where TFactory : IConvertorFactory<Bar, T>, new()
{
private static TFactory convertor = new TFactory();
public T BarMaker(Bar b)
{
return convertor.Convert(b);
}
}
public interface IConvertorFactory<TFrom, TTo>
{
TTo Convert(TFrom from);
}
#endregion
#region user defined code
public class BarToFooConvertor : IConvertorFactory<Bar, Foo>
{
public Foo Convert(Bar from)
{
return (Foo) from;
}
}
public class Foo
{
public Foo(int a) {}
public static explicit operator Foo(Bar f)
{
return null;
}
public Foo Convert(Bar b)
{
return (Foo) b;
}
}
#endregion
public class Demo
{
public static void demo()
{
Bar b = new Bar();
SomeWeirdClass<Foo, BarToFooConvertor> weird = new SomeWeirdClass<Foo, BarToFooConvertor>();
Foo f = weird.BarMaker(b);
}
}
उन्हें बनाने के लिए * आसान * बनाने के लिए एपीआई बनाने का मुद्दा नहीं है? –
इसे एक दिलचस्प शैक्षणिक प्रश्न पर विचार करें। – fostandy