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 回答