2

それ自体のリストを返す抽象メソッドを持つ基本クラスがあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public abstract class baseclass
    {
        public abstract List<baseclass> somemethod();        
    }
}

そして、* it *selfのリストを返すことによって基本クラスのメソッドをオーバーライドしようとする子孫。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class childclass : baseclass
    {
        public override List<childclass> somemethod()
        {
            List<childclass> result = new List<childclass>();
            result.Add(new childclass("test"));
            return result;
        }

        public childclass(string desc)
        {
            Description = desc;
        }

        public string Description;
    }
}

しかし、私はこのエラーが発生します:

Error   1   'ConsoleApplication1.childclass.somemethod()':
return type must be 'System.Collections.Generic.List<ConsoleApplication1.baseclass>'
to match overridden member 'ConsoleApplication1.baseclass.somemethod()' 
C:\Users\josephst\AppData\Local\Temporary Projects\ConsoleApplication1childclass.cs 
0   42  ConsoleApplication1

同じことを行う基本クラスのメソッドをオーバーライドして、基本クラスがそれ自体のリストを返すようにするための最良の方法は何ですか?

4

3 に答える 3

2

メソッドをオーバーライドする場合、オーバーライドするメソッドのシグネチャは、オーバーライドされるメソッドのシグネチャと正確に一致する必要があります。ジェネリックを使用して、必要なことを実現できます。

public abstract class BaseClass<T>
{
    public abstract List<T> SomeMethod();
}

public class ChildClass : BaseClass<ChildClass>
{
    public override List<ChildClass> SomeMethod() { ... }
}
于 2012-08-13T19:27:41.630 に答える
2

ジェネリックは良い解決策ですが、public abstract List<baseclass> somemethod();悪い習慣なので使用しないでください

非仮想インターフェイス パターンを使用する必要があります

public abstract class BaseClass<T>
{
    protected abstract List<T> DoSomeMethod();

    public List<T> SomeMethod()
    {
        return DoSomeMethod();
    }
}

public class ChildClass : BaseClass<ChildClass>
{
    protected override List<ChildClass> DoSomeMethod(){ ... }
}
于 2012-08-13T19:40:25.303 に答える
1

エラーメッセージは一目瞭然です。メソッドをオーバーライドするには、List<baseclass>.

public override List<baseclass> somemethod()
{
    List<childclass> result = new List<childclass>();
    result.Add(new childclass("test"));
    return result;
}
于 2012-08-13T19:29:58.917 に答える