Создайте наследованный класс из базового класса

public class Car 
{ 
    private string make;
    private string model;
    public Car(string make, string model)
    {
         this.make = make;
         this.model = model;
    }
    public virtual void Display()
    {
       Console.WriteLine("Make: {0}", make);
       Console.WriteLine("Model: {0}", model);
    }
    public string Make
    {
       get{return make;}
       set{make = value;}
    }
    public string Model
    {
       get{return model;}
       set{model = value;}
    }
}

public class SuperCar:Car
{
    private Car car;
    private int horsePower;
    public SuperCar(Car car)
    {
        this.car = car;
    }
    public int HorsePower
    {
       get{return horsePower;}
       set{horsepower = value;}
    }
    public override void Display()
    {
       base.Display();
       Console.WriteLine("I am a super car");
}

Когда я делаю что-то как

Car myCar = new Car("Porsche", "911");
SuperCar mySupcar = new SuperCar(myCar);
mySupcar.Display();

Я только добираюсь, "Я - суперкар", но не свойства моего базового класса. Я должен явно присвоить свойства своего базового класса в конструкторе SuperCar? На самом деле я пробую Шаблон "декоратор", где я хочу, чтобы класс добавил поведение к базовому классу.

5
задан Raj 20 May 2010 в 16:20
поделиться

5 ответов

в качестве альтернативы:

public class Car
{
    public Car(string make, string model)
    {
         this.make = make;
         this.model = model;
    }


    public Car (Car car):this(car.Make, Car.Model){}
}

public class SuperCar : Car
{
  SuperCar(Car car): base(car){}
}

Таким образом, вы можете унаследовать любой класс от автомобиля, а содержимое автомобиля будет заполнено из предоставленного объекта. Унаследованным объектам не нужно ничего знать о том, что устанавливать. Они просто передают текущий объект Car базовому классу, и он выполняет всю работу.

8
ответ дан 18 December 2019 в 11:54
поделиться

Измените свойства private на свойства protected, private недоступны никому, кроме класса, который их создает, в то время как переменные protected могут быть доступны наследуемым классам.

0
ответ дан 18 December 2019 в 11:54
поделиться

Глядя на ваш код, я не понимаю, как он компилируется. Ваши конструкторы ошибаются, потому что базовый конструктор не знает, как запустить конструктор, который принимает тип car. Похоже, вы пытаетесь реализовать шаблон декоратора, но сделали это неправильно. На самом деле у вас должен быть интерфейс ICar , который реализует и из Display () в SuperCar , вы должны вызвать car.Display () ] Вам также нужно будет реализовать Make и Model на Super car и заставить их возвращать car.Make & car.Model, чтобы правильно реализовать шаблон декоратора.

public interface ICar
{
    string Make {get; set;}
    string Model {get; set;}
    void Display();
}

public class Car :ICar
{ 
    private string make;
    private string model;
    public Car(string make, string model)
    {
         this.make = make;
         this.model = model;
    }
    public virtual void Display()
    {
       Console.WriteLine("Make: {0}", make);
       Console.WriteLine("Model: {0}", model);
    }
    public string Make
    {
       get{return make;}
       set{make = value;}
    }
    public string Model
    {
       get{return model;}
       set{model = value;}
    }
}

public class SuperCar:ICar
{
    private ICar car;
    private int horsePower;
    public SuperCar(ICar car)
    {
        this.car = car;
    }

    public string Make
    {
       get{return car.Make;}
       set{car.Make = value;}
    }
    public string Model
    {
       get{return car.Model;}
       set{car.Model = value;}
    }
    public int HorsePower
    {
       get{return horsePower;}
       set{horsepower = value;}
    }
    public override void Display()
    {
       car.Display();
       Console.WriteLine("I am a super car");
}
1
ответ дан 18 December 2019 в 11:54
поделиться

да, чтобы заставить это работать так, как вы хотите, вам нужно установить базовый конструктор, как показано ниже:

public SuperCar(Car car):base(car.make,car.model)
{
  this.car = car;
}
0
ответ дан 18 December 2019 в 11:54
поделиться

Вы не совсем реализуете паттерн декоратор

Вам нужен абстрактный базовый класс для хранения декорированной машины

  public abstract class CarDecorator
  {
    protected Car DecoratedCar { get; private set; }

    protected CarDecorator(Car decoratedCar)
    {
      DecoratedCar = decoratedCar;
    }
  }

  public class SuperCar : CarDecorator
  {
    public SuperCar(Car car)
      : base(car)
    {
    }
    public int HorsePower
    {
      get { return horsePower; }
      set { horsepower = value; }
    }
    public override void Display()
    {
      DecoratedCar.Display()
      Console.WriteLine("Plus I'm a super car.");
    }
  }
0
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: