2009-03-24 20 views
9

Mam następującą strukturę:Określanie typu zwracanej abstrakcyjnej metody z klasy bazowej według PODKLASA

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() { 

    } 
} 

Chcę stworzyć abstrakcyjną metodę, która zwraca niezależnie od klasy betonu klasy sub jest. Tak więc, jak widać na przykładzie, metoda w SubOne powinna zwrócić List<SubOne>, podczas gdy metoda w SubTwo powinna zwrócić List<SubTwo>.

Jakiego typu określam w podpisie zadeklarowanym w klasie bazowej?


[UPDATE]

Dziękuję za zamieszczonymi odpowiedziami.

Rozwiązaniem jest, aby klasa abstrakcyjna rodzajowe, takie jak:

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

w twojej aktualizacji/odpowiedź, w jaki sposób utworzyć listę lub kolekcję klasy „podstawowy”, które mogą zawierać zarówno SubOne i obiekty SubTwo? –

Odpowiedz

18

Twoja klasa abstrakcyjna powinny mieć charakter ogólny.

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() { 
    } 
} 

Jeśli chcesz zapoznać się z klasy abstrakcyjnej bez uniwersalnym typem argumentu użyć interfejsu:

interface IBase { 
     //common functions 
} 

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

Doskonałe, dokładnie to, czego szukałem. Dziękuję –

+0

Dang, * mam *, aby nauczyć się pisać szybciej. –

1

Nie sądzę, że można dostać się być specyficzna podklasy. Można to zrobić choć:

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

Spróbuj tego:

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>(); } 
} 
Powiązane problemy