Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从基类继承实例值_C#_Oop - Fatal编程技术网

C# 从基类继承实例值

C# 从基类继承实例值,c#,oop,C#,Oop,假设您有这样的类关系: class Banana : Fruit { } public class Fruit { public int Price { get; set; } public string Origins { get; set; } } public class Banana : Fruit { public string peelDensity; public static Banana AsBanana(Fruit f) {

假设您有这样的类关系:

class Banana : Fruit { }
public class Fruit
{
    public int Price { get; set; }
    public string Origins { get; set; }
}

public class Banana : Fruit
{
    public string peelDensity;

    public static Banana AsBanana(Fruit f)
    {
        return f as Banana ?? new Banana { Price = f.Price, Origins = f.Origins };
    }
}
Banana b = Banana.AsBanana( myFruit);
如果有一些公共全局值已经分配给了fruit,有没有办法让一个新的banana类继承这些现有值

例如:

class Fruit
{
   public int price;
   public string origins;
}

class banana : fruit
{
    public string peelDensity; 

    public Fruit (peelDensity p, int pr, string o)
    {
        peelDensity = p; 
        price = pr; 
        o = origins;
    }
}
假设一个现有的水果实例已经分配了它的
价格
产地
等。假设这是适用于特定香蕉的常见水果数据。香蕉将如何继承这些值

有没有比在构造函数中提供所有现有值更好的方法

banana b = new banana(peel, price, origins);
有没有一种方法可以对复制构造函数执行类似的操作:

public Banana(Fruit fruit)
{
    Price = fruit.Price;
    Origin = fruit.Origin;
}

Fruit apple = new Fruit(50, "some origin");
Banana banana = new Banana(apple);
公共香蕉(水果){this=水果;}


以上只是一些伪代码。在我的项目中,我的Fruit类已经分配了20多个值,Banana类应该继承所有这些值,但我想知道是否有更好的方法来编写更优雅的构造函数类。

当我理解您的问题时,我认为您与此相关:

This is your base class

public class Fruit{
     public double Price { get; set; }
     public string Origins { get; set; }

     //or you can create a constructor
     //one default constructor
     public virtual void GetPrice()
     {
          Price = 69;
     }
}
这是你的孩子班:

public class Banana : Fruit{
     public string peelDensity { get; set; }    


      //this is a sample of Default Constructor
     public Banana()
            :base()
     {
          Price = 0; //here you're setting default value to banana once it's initialized
     }
     public override void GetPrice()
    {
          //base.GetPrice(); //here you get the value from the Parent Class 
            Price = 100; // here you're setting a value for the price of Banana once you call this method;
    }
}

只需添加一些提示,因为您的Fruit类非常通用,您可以将其设置为一个抽象类(可以与其子类一起继承的抽象方法的集合),但有许多方法可以抽象类,并且只要在需要时为构造函数设置默认值即可,通过使用复制构造函数和工厂方法

复制构造函数:

public Banana(Fruit fruit)
{
    Price = fruit.Price;
    Origin = fruit.Origin;
}

Fruit apple = new Fruit(50, "some origin");
Banana banana = new Banana(apple);
工厂方法:

public static class FruitFactory
{
    public static Banana BananaFromFruit(Fruit fruit)
    {
        return new Banana(fruit.Price, fruit.Origin);
    }
}

Fruit apple = new Fruit(50, "some origin");
Banana banana = FruitFactory.BananaFromFruit(apple);

请注意,我修改了类及其属性的大小写,以遵循c#约定。

正如@JC Borlagdan提到的另一种方法是创建一个香蕉工厂,该工厂反过来创建具有某些预设属性的香蕉对象。 然后,每个继承都有一个单独的工厂,负责默认属性

您可以简单地用谷歌搜索工厂模式。有很多例子和解释

工厂也可以是一种方法,不必存在于类中。 下面是一个小例子:

class BananaFactory {

    public int price;
    public string origins;

    Banana CreateBanana() {
        return new Banana(){
            peelDensity = "SomeValue",
            price = price,
            origins = origins
        };
    }
}


var banana = bananaFactoryinstance.CreateBanana();

// banana has price and origins that are set in the factory 

你可以这样做:

class Banana : Fruit { }
public class Fruit
{
    public int Price { get; set; }
    public string Origins { get; set; }
}

public class Banana : Fruit
{
    public string peelDensity;

    public static Banana AsBanana(Fruit f)
    {
        return f as Banana ?? new Banana { Price = f.Price, Origins = f.Origins };
    }
}
Banana b = Banana.AsBanana( myFruit);
静态方法允许将水果作为香蕉返回。如果它已经是一个香蕉存储在一个类型为水果的变量中,它将作为香蕉返回。否则,将创建一个新的香蕉,并将值复制到上面

如果你想把水果变成香蕉,就这样称呼它:

class Banana : Fruit { }
public class Fruit
{
    public int Price { get; set; }
    public string Origins { get; set; }
}

public class Banana : Fruit
{
    public string peelDensity;

    public static Banana AsBanana(Fruit f)
    {
        return f as Banana ?? new Banana { Price = f.Price, Origins = f.Origins };
    }
}
Banana b = Banana.AsBanana( myFruit);

香蕉始终可以指定给声明为水果的变量,但反之亦然。这是面向对象开发的要点之一。

它不能继承这一点。你需要把它们复制过来(也许是工厂方法?)我正努力理解你的问题。您能否提供一个说明如何填充这些值的示例?另外,请指定您期望的结果(但没有得到)。@nkosi您的意思是我应该在香蕉的构造函数中手动分配水果中的所有现有值吗?@DavidG我正在学习如何在我姑妈的计算机上编码。请不要吝啬。我们每天都在学习新的东西。@ina-C#没有“公共全球价值观”。听起来你还没有完全明白继承意味着什么。继承只是扩展类的定义,而不是扩展现有实例
banana
不会扩展
fruit
的现有实例
banana
仅扩展了
fruit
的定义。如果价格对我来说是公开的,为什么我要调用GetPrice方法呢?我这样做只是为了说明当你需要继承时继承是如何起作用的(因为一开始我对你的问题感到困惑)。我想你已经得到答案了有没有一种方法可以自动化复制构造函数?在我的例子中,我的基类已经分配了20多个值。我想我想做这样的事情
publicbanana(Fruit-Fruit){this=Fruit;}
@ina发布的方式在运行时是最快的。在编码时执行此操作的更快方法是使用反射动态复制属性。我可以添加一个例子,但这远远不是标准的OOP。创建工厂类对于一个简单的任务来说是一个巨大的时间浪费,而这个任务应该在香蕉级别完成。使用构造函数会迫使您创建一个新的香蕉,即使水果可能已经是香蕉了。@jimberg您能举个例子吗?