从基类继承实例值

时间:2018-07-30 00:11:18

标签: c# oop

假设您具有这样的类关系:

class Banana : Fruit { }

如果已经为水果分配了一些公共全局值,是否有办法让新的香蕉类继承这些现有值?

例如:

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;
    }
}

说一个现有的水果实例已经分配了priceorigins等。假设这实际上是适用于特定香蕉的常见水果数据。香蕉将如何继承这些价值?

是否有比需要提供构造函数中所有现有值更好的方法?

banana b = new banana(peel, price, origins);

有没有一种方法可以对复制构造函数执行以下操作:

public Banana(Fruit fruit){ this = fruit; }

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

4 个答案:

答案 0 :(得分:1)

使用复制构造函数和工厂方法有两种常用方法。

复制构造函数:

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#约定。

答案 1 :(得分:1)

您可以执行以下操作:

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 };
    }
}

静态方法允许返回“水果”作为香蕉。如果香蕉已经存储在类型为Fruit的变量中,则它将作为香蕉返回。如果没有,将创建一个新的香蕉并复制值。

如果要将水果转换为香蕉,只需像这样称呼它:

Banana b = Banana.AsBanana( myFruit);

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

答案 2 :(得分:0)

据我所知,我认为您与此有关:

minikube start
kubectl config use-context minikube
kubectl create ns my-namespace

这是您的孩子班级:

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;
     }
}

只需添加一些技巧,由于您的Fruit类非常通用,您可以将其设置为 Abstract Class (可以与其子类继承的抽象方法的集合),但是有很多方法提取抽象类的方法,并且仅在需要时为构造函数设置默认值。

答案 3 :(得分:0)

@JC Borlagdan提到的另一种方法是创建一个香蕉工厂,该工厂又会创建具有某些特定属性的香蕉对象。 然后,每个继承都有一个单独的工厂来处理默认属性。

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

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

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