using System.Collections.Generic;
public string Name {get;set;}
public string Email {get;set;}
public interface IProduct{
bool HasOrderCompleted {get;}
void ShipItem(Customer customer);
class PhysicalProduct:IProduct{
public string Name {get;set;}
public bool HasOrderCompleted {get;private set;}
public void ShipItem(Customer customer){
if(this.HasOrderCompleted==false){
Console.WriteLine("Physical Product {0} shipped to {1}",this.Name,customer.Name);
this.HasOrderCompleted = true;
class DigitalProduct:IProduct{
public string Name {get;set;}
public bool HasOrderCompleted {get;private set;}
public int DownloadsRemaining {get;set;}=5;
public void ShipItem(Customer customer){
if(this.HasOrderCompleted==false){
Console.WriteLine("Digital Product {0} Mailed to {1}",this.Name,customer.Email);
this.HasOrderCompleted = true;
this.DownloadsRemaining--;
public string Name {get;set;}
public bool HasOrderCompleted {get;private set;}
public decimal Hours {get;set;}
public void SubscribeService(Customer customer){
Console.WriteLine("{0} Subscribed {1} for {2} hours",customer.Name,this.Name,this.Hours);
public static void Main()
var products = GetProducts();
var customer = new Customer(){Name="Shahanad",Email="shahanad987@gmail.com"};
foreach(var product in products){
product.ShipItem(customer);
if(product is DigitalProduct){
DigitalProduct digital = (DigitalProduct)product;
Console.WriteLine("Downloads Remaining = {0}",digital.DownloadsRemaining);
public static List<IProduct> GetProducts(){
var Products = new List<IProduct>();
Products.Add(new PhysicalProduct(){ID=1,Name="Nike Bag"});
Products.Add(new DigitalProduct(){ID=1,Name="DataStructure & Algorithms PDF"});