【发布时间】:2019-09-09 10:53:33
【问题描述】:
我有以下两个类:
public class Foo : IFooOperations
{
public FooData Data { get; set; }
public FooUser User { get; set; }
public Foo(FooData fooData)
{
Data = fooData;
}
private async void SetupFoo()
{
...
}
public async void FooOp()
{
...
}
}
和
public class Bar : Foo, IBarOperations
{
public Foo(FooData fooData) : base(fooData)
{
}
public async void BarOp()
{
...
}
}
在我获得Foo 对象后,为什么Bar bar = (Bar)foo; 不允许我将其转换为Bar 对象?它会引发 InvalidCastException: Specified cast is not valid. 异常。
在我看来,这应该可行。 Bar 只是 Foo 有一个额外的方法对两个对象已经通用的状态进行操作。
一些额外的上下文:Bar 对象本质上是特权Foo 用户,根据他们的数据,他们被允许访问BarOp() 方法。我正在构建一个 SDK,并希望(ab)使用强制转换机制来默认隐藏这些特权方法。我希望我的最终用户需要有意识地决定 Foo 确实是 Bar 并在他们能够访问 BarOp() 方法之前执行转换。
是否有人对可能出现的问题、我如何解决此问题或要考虑的替代架构有任何想法?
【问题讨论】:
-
这与 Bar 也实现了 IBarOperations 的事实有关,这不是 Foo 的事情
-
顺便说一句,您实际上有很多异步 void 方法吗?我强烈建议不要这样做 - 如果可能的话,让他们返回
Task。我意识到这可能实际上不能代表您的代码。 -
啊,谢谢!回想起来,在这里错过似乎是一件愚蠢的事情。 @JonSkeet 别担心,这些实际上都是任务。 :)
标签: c# inheritance interface casting