Avatar
あるメソッドfが、@MainActor で保護されているとき、 そのメソッドは、MainActorからの呼び出し→そのまま 他のActorからの呼び出し→async化 というのが型としての挙動で それを継承したサブクラスが @MainActor では無かったとした場合 継承してオーバーライドしたメソッドは、 サブクラスのメソッドとしてみれば、保護が外れているので、 どこから呼び出してもそのままの挙動 つまり、マルチスレッドセーフなメソッドとして実装されているという仮定が置ける。 このマルチスレッドセーフなオーバーライド実装を、 スーパークラスのメソッドとしてアップキャストして見てみると、 @MainActor として保護されている事になるけど、 MainActorからの呼び出し→マルチスレッドセーフな実装にオーバライドされているので問題ない 他のActorからの呼び出し→実装に対しては無意味にasync化するけど、本体はやはりマルチスレッドセーフなので問題ない (edited)
6:31 AM
逆方向は問題が起きると思う。 親クラスのメソッドが何も保護がなければ暗黙にマルチスレッドセーフ 継承先のサブクラスでMainActor保護をかけた場合、 オーバライド呼び出しにおいて、MainActorディスパッチ無しで呼び出されるので、 サブクラス側からみてMainActorコンテキストで実行されるという仮定が破壊される。