C#抽象功能分配(代理)

时间:2019-01-28 08:42:20

标签: c# delegates func

我有以下抽象Func。

public abstract Func<IEnumerable<TInput>, int, TIndexed> IndexedObjectConstructor { get; }

我的问题与实施方法有关。 第一:我创建一个具有相同签名的方法

 public  IIndexedOhlcv Test(IEnumerable<IOhlcv> l, int i)
        {
            return new IndexedCandle(l, i);
        } 

The,将其分配给Func。

 public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor = Test;

但是,这显示了错误

  

错误CS0106修饰符“覆盖”对此项目无效

我知道可以使用Lambda如下解决此问题:

 public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor => Test;

  public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
           => (l, i) => new IndexedCandle(l, i);

我的问题是我的“ IndexedObjectConstructor = Test”;不起作用?

4 个答案:

答案 0 :(得分:2)

IndexedObjectConstructor是一个仅获取属性,它返回一个Func<IEnumerable<TInput>, int, TIndexed>。在尝试覆盖的过程中,您正在定义要使用IndexedObjectConstructor初始化的字段Test

字段不能被覆盖(即使可能,它也是基类中的属性,而不是字段),并且Test本身也不是属性获取器。

“使用lambda”实现它时,您使用的是相对较新的inline property declaration语法。

答案 1 :(得分:1)

这是因为被覆盖的东西是一个属性,这意味着您必须在覆盖时声明一个get访问器,而这样做并不会完成

public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor = Test;

它还解释了以下原因的原因

public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor => Test;

答案 2 :(得分:0)

您不能只是将方法分配给属性。您需要完全实现get

您的代码应如下所示:

public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
{
    get
    {
        return (xs, i) => Test(xs, i);
    }
}

但是,使用这样的更新语法就足够了:

public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
{
    get => Test;
}

...或者这个:

public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
    => Test;

答案 3 :(得分:0)

这是完整的工作示例。

public abstract class Test<TInput, TIndexed>
    {
        public abstract Func<IEnumerable<TInput>, int, TIndexed> IndexedObjectConstructor { get; }
    }

    public class Test1 : Test<IOhlcv, IIndexedOhlcv>
    {
        public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor
        {
            get
            {
                return TestMethod;                
            }
        }

        public IIndexedOhlcv TestMethod(IEnumerable<IOhlcv> l, int i)
        {
            return null;
        }
    }

    public interface IOhlcv
    {

    }

    public interface IIndexedOhlcv
    {

    }

现在,如果您要问为什么我们必须使用getter实现属性。您可以使用其他语法。您可以按照以下方式进行操作。

 public class Test1 : Test<IOhlcv, IIndexedOhlcv>
{
    public override Func<IEnumerable<IOhlcv>, int, IIndexedOhlcv> IndexedObjectConstructor => TestMethod;        

    public IIndexedOhlcv TestMethod(IEnumerable<IOhlcv> l, int i)
    {
        return null;
    }
}