C# 如何创建将返回公共接口派生类型的工厂类

C# 如何创建将返回公共接口派生类型的工厂类,c#,design-patterns,factory,C#,Design Patterns,Factory,我有一个接口,它由许多类实现。每个类也有自己的一组属性,这些属性在接口中不存在。现在,如果我想设计一个返回接口类型的工厂,我不能设置一些派生类属性,因为它们不是接口的成员 如何解决这种情况?如果您有这样的界面 public interface MyInterface { string Name { get; } } 以及类似的实现 public class MyClass : MyInterface { string Name { get; set; } int So

我有一个接口,它由许多类实现。每个类也有自己的一组属性,这些属性在接口中不存在。现在,如果我想设计一个返回接口类型的工厂,我不能设置一些派生类属性,因为它们不是接口的成员


如何解决这种情况?

如果您有这样的界面

public interface MyInterface 
{
    string Name { get; }
}
以及类似的实现

public class MyClass : MyInterface
{
    string Name { get; set; }
    int Something { get; set; }
}

public class MySecondClass : MyInterface
{
    string Name { get; set; }
    decimal SomethingElse { get; set; }
}
您可以在工厂中创建类,如

public class MyFactory
{
    public MyInterface createMyClass() 
    {
        return new MyClass() { Name = "foo", Something = 42 };
    }

    public MyInterface createMySecondClass() 
    {
        return new MySecondClass() { Name = "bar", SomethingElse = 4.2M };
    }
}
当然,这样您就不能访问接口中未声明的成员

var something = myFactory.createMyClass().Something;
这行不通。您只能访问name属性:

var name = myFactory.createMyClass().Name;
如果要访问类的特殊属性,则必须将接口转换为实际类:

var something = ((MyClass)myFactory.createMyClass()).Something;

一种方法是使用工厂方法泛型。你能提供任何描述工厂方法泛型的链接吗?请看这里:可能重复的不是真的。您可以创建并返回实现返回类型的超类型接口的任何派生类型的实例。返回值必须向下转换才能获得原始子类型。不建议使用泛型类型描述返回类型的泛型工厂。这是一种反模式,因为您必须在工厂内执行类型检查以选择要返回的正确实例。为每种按系数计算的退货类型引入专用工厂更为方便。