2017-05-31 78 views
-1

假设我有一个从水果类如何根据不同的参数创建不同类的不同对象?

扩展苹果类和我有一个从水果类扩展橙类太

两个班有两个不同的构造

苹果有苹果(大小,颜色,味道,重量);橙色有橙色(大小,半径,直径);

每个对象有自己独特的方法,我必须调用

如何创建不同的情况下,仅仅通过创建水果类?根据不同的参数?像

Fruit a = new Fruit(int size, int colour, String taste, int weight); To create apple 
Fruit a = new Fruit(int size, int radius, int diameter); To create orange 

我该怎么做?请帮助

UPDATE:

我明白我必须用工厂,但我并没有训练做,我怎么使用工厂在C#实现上述

因为我的老板只说他希望用户在不关心水果名称的情况下将参数输入水果类。他告诉我用java调用工厂,我该怎么做?

+2

简而言之:你不知道。构造函数是特定于水果类型的,那么为什么你会试图在基类水果中强制它们的构造函数呢?如果你知道你正在创建一个Apple(因为你正在调用Apple特定的构造函数),为什么不用新的Apple()代替Fruit()呢? 您可能想看看一个工厂,您可以在其中实施CreateFruit并带有多个重载,以根据签名返回特定的水果。 –

+0

'每个对象都有自己独特的方法 - 但你的问题被标记为[多态] - 我认为你需要去查找那个单词。另外,我认为你需要向老板寻求澄清。他被问到的你毫无意义。 – Jamiec

+0

他的意思是他希望Fruit对象根据用户输入的参数自动将对象分类为Apple或Orange,而不必声明苹果或橙色 – user2399158

回答

1

使用从派生类的构造函数:

Fruit a = new Apple(size, colour, taste, weight); 

基于更新后的问题,如果你使用一个工厂,你的工厂将返回果型,所以我没有看到过简单地使用多少好处构造函数重载:

public class Fruit 
{ 
    public Fruit(int size, int colour, string taste, int weight) { } 
    public Fruit(int size, int radius, int diameter) { } 
} 
+0

我不能那样做,我不得不从Fruit类打电话 – user2399158

+0

我已根据您更新的问题更新了我的答案。例如,每个不同的构造函数都可以在Fruit类上设置一个enum属性来表示它是否是苹果,橙色等。 – ZippyZippedUp

0

你可以试试这个:

public class Fruit 
{ 
    public static Fruit CreateFruit(string v1, string v2) 
    { 
     return new Apple(v1, v2); 
    } 

    public static Fruit CreateFruit(string v1, int v2, int v3) 
    { 
     return new Orange(v1, v2, v3); 
    } 
} 

public class Apple : Fruit 
{ 
    string var1 { get; set; } 
    string var2 { get; set; } 

    public Apple(string v1, string v2) 
    { 
     this.var1 = v1; 
     this.var2 = v2; 
    } 
} 


public class Orange : Fruit 
{ 
    string var1 { get; set; } 
    int var2 { get; set; } 
    int var3 { get; set; } 

    public Orange(string v1, int v2, int v3) 
    { 
     this.var1 = v1; 
     this.var2 = v2; 
     this.var3 = v3; 
    } 
} 
+0

您是否意味着使您的工厂方法变为静态?与他们的实例这将是*怪异的 - - 你需要一个'水果'的实例来调用它们。 – Jamiec

+0

你是对的。我已将方法CreateFruit更改为静态 – daniell89

+0

技术上完全正常,但它基本上将工厂包装在基类中,唯一原因是符合看似无意义的规则。当然不是你的错,你直接回答了这个问题:) – Flater