0

我是.net 的初学者。我正在尝试了解织物图案方法。

我找到了这个代码示例

   public abstract class Person
{
    public string Name { get; set; }
    public decimal Salary { get; set; }
}

public class Employee : Person
{
    public Employee()
    {
        this.Salary = 20000;
    }

}

public class Pilot : Person
{
    public string PilotNumber { get; set; }

    public Pilot()
    {
        this.Salary = 50000;
    }
}

public static class PersonFactory
{
    public static Person CreatePerson(string typeOfPerson)
    {
        switch (typeOfPerson)
        {
            case "Employee":
                return new Employee();
            case "Pilot":
                return new Pilot();
            default:
                return new Employee();
        }
    }
}

并使用工厂:

Person thePilot = PersonFactory.CreatePerson("Pilot");
    ((Pilot)thePilot).PilotNumber = "123ABC";

我无法理解此示例中的 CreatePerson 方法。

public static Person CreatePerson(string typeOfPerson)
    {
        switch (typeOfPerson)
        {
            case "Employee":
                return new Employee();
            case "Pilot":
                return new Pilot();
            default:
                return new Employee();
        }
    }

该方法返回 Person 类型,但在 switch 运算符中,您可以看到它创建并返回 Pilot() 或 Employee() 实例类。

这怎么可能是方法签名中的返回类型定义与函数本身的返回类型不同。

4

4 回答 4

3

将工厂方法更新为泛型方法会容易得多。像这样。

public static TPerson CreatePerson<TPerson>() where TPerson: Person {
    if (typeof(TPerson) == typeof(Employee)) {
        return new Employee();
    } else if (typeof(TPerson) == typeof(Pilot)) {
        return new Pilot();
    } else {
        return new Employee();
    }
}

然后你可以不用任何演员来使用它:

Pilot pilot = PersonFactory.CreatePerson<Pilot>();
pilot.PilotNumber = "123ABC";
于 2012-07-12T13:13:27.750 回答
2

因为所有这些返回类型都继承自 Person。您可以从函数隐式返回派生类。

public class Employee : Person <------ this Employee is inheriting the abstract class 'Person' (but not implementing anything from it)
{
    public Employee()
    {
        this.Salary = 20000;
    }

}

例如上面 - Employee 类实际上也是一个 Person ,因为它继承自抽象类(它实际上没有实现抽象类的任何东西,因为没有什么要实现的)

这里的 Person 类是抽象的,但它没有指定任何抽象成员——这只是测试代码吗?

于 2012-07-12T13:05:02.817 回答
1

因为 Pilot 继承自 Person。

于 2012-07-12T13:05:48.850 回答
1

Employee 和 Pilot 类是person 的子类派生类。在 OOP 中,这类似于关系。员工是人,飞行员是人,因此返回其中一种类型是完全合法的。调用者将不知道(不使用反射)它返回的是什么类型的人,也不应该关心。

于 2012-07-12T13:05:57.040 回答