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



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

如何解决这种情况?

如果你有一个像这样的接口

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;

这是行不通的。您只能访问名称属性:

var name = myFactory.createMyClass().Name;

如果要访问类的特殊属性,则必须将接口强制转换为实际类:

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

最新更新