18

私は次の構造を持っています:

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>ます。

Base クラスで宣言された署名で指定する型は何ですか?


[アップデート]

投稿された回答に感謝します。

解決策は、次のように抽象クラスをジェネリックにすることです。

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

    }
} 
4

5 に答える 5

34

抽象クラスはジェネリックにする必要があります。

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

ジェネリック型引数なしで抽象クラスを参照する必要がある場合は、インターフェイスを使用します。

interface IBase {
        //common functions
}

abstract class Base<T> : IBase {
        public abstract List<T> Get(); 
}
于 2009-03-24T01:32:55.947 に答える
4
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>(); }
}
于 2009-03-24T01:34:28.517 に答える
2

これを試して:

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.
}
于 2009-03-24T01:33:44.383 に答える
1

それを特定のサブクラスにすることはできないと思います。ただし、これを行うことができます:

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();
    }
}
于 2009-03-24T01:33:06.180 に答える