using Optional; namespace OO3; public class OfferingType { public virtual Option<string> GetDownloadUrl() { return Option.None<string>(); } public virtual Option<string> GetDefaultDownloadFileName() { return Option.None<string>(); } } public class DownloadableContent : OfferingType { public override Option<string> GetDownloadUrl() { return Option.Some("Some value"); } public override Option<string> GetDefaultDownloadFileName() { return Option.Some("Some value"); } } public sealed record Product(int Id, OfferingType Type); public sealed class ProductHandler() { public void DoStuff(Product product) { var fileName = product.Type.GetDefaultDownloadFileName(); var downloadUrl = product.Type.GetDownloadUrl(); } }