using System;
public class Test
{
public static void Main()
{
var concreteMapperFactory = new ConcreteMapperFactory();
concreteMapperFactory.GetMapper<Box>(new Box());
if (concreteMapperFactory.concreteCalled)
{
Console.WriteLine("Concrete called");
}
if (concreteMapperFactory.templateCalled)
{
Console.WriteLine("Template called");
}
}
public interface IShape
{
}
public class Circle:IShape{}
public class Box: IShape{}
public abstract class AbstractMapperFactory
{
public abstract void GetMapper<TSource>(TSource obj) where TSource : class;
}
class ConcreteMapperFactory: AbstractMapperFactory
{
public bool concreteCalled;
public bool templateCalled;
public void GetMapper(Box box)
{
concreteCalled = true;
}
public override void GetMapper<TSource>(TSource obj)
{
templateCalled = true;
}
}}
dXNpbmcgU3lzdGVtOwoKcHVibGljIGNsYXNzIFRlc3QKewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCgl2YXIgY29uY3JldGVNYXBwZXJGYWN0b3J5ID0gbmV3IENvbmNyZXRlTWFwcGVyRmFjdG9yeSgpOwogICAgICAgICAgICBjb25jcmV0ZU1hcHBlckZhY3RvcnkuR2V0TWFwcGVyPEJveD4obmV3IEJveCgpKTsKCiAgICAgICAgICAgIGlmIChjb25jcmV0ZU1hcHBlckZhY3RvcnkuY29uY3JldGVDYWxsZWQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25jcmV0ZSBjYWxsZWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNvbmNyZXRlTWFwcGVyRmFjdG9yeS50ZW1wbGF0ZUNhbGxlZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlbXBsYXRlIGNhbGxlZCIpOwogICAgICAgICAgICB9Cgl9CgkKCSAgICBwdWJsaWMgaW50ZXJmYWNlIElTaGFwZQogICAgewogICAgfQoKICAgIHB1YmxpYyBjbGFzcyBDaXJjbGU6SVNoYXBle30KICAgIAogICAgcHVibGljIGNsYXNzIEJveDogSVNoYXBle30KCQoJcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwcGVyRmFjdG9yeQogICAgewogICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIEdldE1hcHBlcjxUU291cmNlPihUU291cmNlIG9iaikgd2hlcmUgVFNvdXJjZSA6IGNsYXNzOwogICAgfQoKCgogICAgY2xhc3MgQ29uY3JldGVNYXBwZXJGYWN0b3J5OiBBYnN0cmFjdE1hcHBlckZhY3RvcnkKICAgIHsKICAgICAgICBwdWJsaWMgYm9vbCBjb25jcmV0ZUNhbGxlZDsKICAgICAgICBwdWJsaWMgYm9vbCB0ZW1wbGF0ZUNhbGxlZDsKICAgICAgICAKICAgICAgICBwdWJsaWMgdm9pZCBHZXRNYXBwZXIoQm94IGJveCkKICAgICAgICB7CiAgICAgICAgICAgIGNvbmNyZXRlQ2FsbGVkID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEdldE1hcHBlcjxUU291cmNlPihUU291cmNlIG9iaikKICAgICAgICB7CiAgICAgICAgICAgIHRlbXBsYXRlQ2FsbGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAKCX19