【问题标题】:How to create factory class which will return the derived types of common interface如何创建将返回公共接口的派生类型的工厂类
【发布时间】:2019-07-22 06:54:46
【问题描述】:

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

如何解决这种情况?

【问题讨论】:

  • 一种方法是使用工厂方法泛型
  • 您能否提供任何描述工厂方法泛型的链接?
  • 这不是真的。您可以创建并返回实现返回类型的超类型接口的任何派生类型的实例。必须向下转换返回值才能获得原始子类型。不推荐使用泛型类型描述返回类型的泛型工厂。这是一种反模式,因为您必须在工厂内部执行类型检查才能选择要返回的正确实例。为每种分解的返回类型引入一个专门的工厂会更方便。

标签: c# design-patterns factory


【解决方案1】:

如果你有类似的接口

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多