2009-03-24 12 views
9

मैं निम्नलिखित संरचना है के अनुसार एक बेस कक्षा से एक सार विधि की वापसी प्रकार निर्दिष्ट करना:एक उप कक्षा

abstract class Base { 
     public abstract List<...> Get(); //What should be the generic type? 
} 

class SubOne : Base { 
    public override List<SubOne> Get() { 

    } 
} 

class SubTwo : Base { 
    public override List<SubTwo> Get() { 

    } 
} 

मैं एक सार विधि है कि रिटर्न जो कुछ वर्ग ठोस उप वर्ग है बनाना चाहते हैं। इसलिए, जैसा कि आप उदाहरण से देख सकते हैं, SubOne में विधि List<SubOne> वापस करनी चाहिए जबकि SubTwo में विधि List<SubTwo> वापस करनी चाहिए।

बेस क्लास में घोषित हस्ताक्षर में मैं किस प्रकार निर्दिष्ट करता हूं?


[अद्यतन]

पोस्ट जवाब के लिए धन्यवाद।

समाधान सार वर्ग सामान्य बनाने के लिए, इस तरह के की तरह है:

abstract class Base<T> { 
     public abstract List<T> Get(); 
} 

class SubOne : Base<SubOne> { 
    public override List<SubOne> Get() { 

    } 
} 

class SubTwo : Base<SubTwo> { 
    public override List<SubTwo> Get() { 

    } 
} 
+1

अपने अद्यतन/उत्तर में, आप कैसे "बेस" वर्ग है कि दोनों SubOne शामिल कर सकते हैं की एक सूची या संग्रह बनाने होगा और SubTwo वस्तुओं? –

उत्तर

18

आपका सार वर्ग सामान्य होना चाहिए।

interface IBase { 
     //common functions 
} 

abstract class Base<T> : IBase { 
     public abstract List<T> Get(); 
} 
+0

बढ़िया, ठीक वही जो मैं खोज रहा था। धन्यवाद –

+0

डांग, मुझे तेज़ी से टाइप करना सीखने के लिए * मिला है *। –

1

मुझे नहीं लगता कि आप इसे विशिष्ट उपवर्ग होने के लिए प्राप्त कर सकते हैं करते हैं:

abstract class Base<T> { 
     public abstract List<T> Get(); 
} 

class SubOne : Base<SubOne> { 
    public override List<SubOne> Get() { 

    } 
} 

class SubTwo : Base<SubTwo> { 
    public override List<SubTwo> Get() { 
    } 
} 

आप सामान्य प्रकार तर्क के बिना सार वर्ग का उल्लेख करने की जरूरत है, एक अंतरफलक का उपयोग करें।

abstract class Base<SubClass> { 
     public abstract List<SubClass> Get(); 
} 
class SubOne : Base<SubOne> { 
    public override List<SubOne> Get() { 
     throw new NotImplementedException(); 
    } 
} 
class SubTwo : Base<SubTwo> { 
    public override List<SubTwo> Get() { 
     throw new NotImplementedException(); 
    } 
} 
1

इस प्रयास करें:: आप इस हालांकि कर सकते हैं

public abstract class Base<T> { 
    public abstract List<T> Foo(); 
} 

public class Derived : Base<Derived> { // Any derived class will now return a List of 
    public List<Derived> Foo() { ... }  // itself. 
} 
3
public abstract class Base<T> 
{  
    public abstract List<T> Get(); 
} 

class SubOne : Base<SubOne> 
{ 
    public override List<SubOne> Get() { return new List<SubOne>(); } 
} 

class SubTwo : Base<SubTwo> 
{ 
    public override List<SubTwo> Get() { return new List<SubTwo>(); } 
}