【发布时间】:2017-07-20 22:50:31
【问题描述】:
很难解释我为什么要做我将要展示给你的事情,但他们有一个理由,所以留在我这里。 (欢迎提出建议)。
我有一个 Functor,它在其输入上调用一个方法。
!请注意!函子实际上是一个扩展方法,所以必须有一个类型推断。
另外,我有一个带有 2 个孩子的抽象类和一个需要方法签名的接口。
示例代码如下所示:
public sealed class AbstractionTester
{
internal static void Run()
{
// The functor here accepts A type but in my original code its just a generic type.
// I wanted to keep it simple for this example only
Func<A, bool> func = a =>
{
a.CallMe(); //Displays "Error"
return true;
};
B obj = new B();
func(obj);
}
}
internal interface ICallMe<T>
where T : MyEntity
{
T CallMe();
}
//Just a class which holds data I would like to store about every object I have, for example: CreateDate
internal abstract class MyEntity
{ }
internal abstract class A : MyEntity, ICallMe<A>
{
//some other fields i would like to store..
// This method here must never be invoked
public A CallMe()
{
//throw new Exception();
Console.WriteLine("Error");
return this;
}
}
internal class B : A, ICallMe<B>
{
public new B CallMe()
{
Console.WriteLine("B");
return this;
}
}
internal class C : A, ICallMe<C>
{
public new C CallMe()
{
Console.WriteLine("C");
return this;
}
}
每次我调用 Run() 时,结果都是 Error 出现在屏幕上。 我能做些什么来强制我拥有的这个函子不会执行父类中的方法。
Functor 永远不会收到 A 的实例,因为 A 是抽象的(我的意思是纯 A,不是 A 的子级)
附加信息:
- 我必须在
B和C类中明确写出CallMe的返回类型。我无法将它们更改为输入A。 - 我需要在仿函数中保留 A 的类型(或类似的东西),因为我需要推断某些代码延续的类型。
【问题讨论】:
-
为什么不在A的B类方法中
override,而是使用new? -
@Tigran 因为接口中定义了方法CallMe
-
你将如何实现相同的通用接口两次?仅返回类型不同?
-
@JeroenvanLangen 我在哪里说过我实现了两次通用接口?如果您参考函子参数类型,它会推断类型,因为函子实际上是我代码中的扩展方法。如果你提到我写 ICallMe
的事实,这个例子被最小化到这个问题,在原始代码中我几乎在我拥有的每个类上都使用它。 -
这里是:
internal abstract class A : MyEntity, ICallMe<A>和这里internal class B : A, ICallMe<B>所以:ICallMe<A>和ICallMe<B>这就是问题所在。他们强制执行具有不同返回类型的 2 种方法。您不能定义仅在返回类型上有所不同的相同方法名。 (重载问题)如果将返回类型从T CallMe();更改为void CallMe(out T t),它将起作用。
标签: c# oop inheritance abstract-class abstract