Method(Func<DownloadedData> download)

もし必要ならこういうのをうけとればいいわけ
めちゃくちゃにクラスが増えてコードが分散して意味不明にならなくて済む

ほとんどの場合は

DownloadedData Download(string url)
Method(DownloadedData data)

これでいいし個別にやり方が違うなら

DownloadedData NicodoDownload(string url)
DownloadedData YoutubeDownload(string url)

Method(DownloadedData data)

これで済む
これじゃどうしてもダメだというなら上のラムダを使えばいい
多態は使っちゃダメ