Могу ли я наследовать от класса, если базовый класс не имеет конструктора - PullRequest
0 голосов
/ 23 сентября 2019

Итак, у меня есть Vehicle класс без конструктора.Я хочу создать новый класс с именем VehicleExtended, который наследует от Vehicle.Ошибка:

«Автомобиль» не содержит конструктор, который принимает 0 аргументов (CS1729)

Возможно ли наследовать без конструктора?

ПРИМЕЧАНИЕ: я не могу редактировать базовый класс, потому что я вижу только его метаданные.

public class VehicleData : Vehicle
{
    [BsonId]public int _id { get; private set;}
    public bool IsCompany { get; private set;}
    public int OwnerID { get; private set; }
    public string modelName { get; private set;}
}

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

Как видно из сообщения об ошибке, базовый класс Vehicle не имеет конструкторов без аргументов :

  public class Vehicle { 
    ...
    // every Vehicle constructors want some parameters, e.g. id and ownerId
    public Vehicle(int id, int ownerId) {...}
    ...
  }

Это компилятор не знает как создать экземпляр VehicleData:

  // Since VehicleData is inherited from Vehicle, 
  // Vehicle cosntructor should be executed.
  // What arguments should be passed to it?   
  var test = new VehicleData();

Вам необходимо реализовать VehicleData конструктор вручную , в котором вы должны указать аргументы:

  public class VehicleData : Vehicle 
  {
    // When creating an instace, use -1 and -1 when calling base constructor
    public VehicleData() : base(-1, -1) {}

    ...
  }

Теперь приведенный выше код допустимый :

  // We don't want parameters when creating VehicleData instance
  // When creating base class (Vehicle) -1 and -1 are used  
  var test = new VehicleData();

Редактировать: Если базовый класс (Vehicle) не имеет никаких public или protected конструкторов (кроме private), вы не можете создать базовый Vehicle экземпляр из VehicleData и, следовательно, не можете наследовать отVehicle.private только конструкторы - старый C ++ трюк;в случае C # , чтобы предотвратить наследование , мы должны использовать sealed

0 голосов
/ 23 сентября 2019

На основании сообщения об ошибке я предполагаю, что класс VehicleData имеет собственный конструктор с нулевым аргументом.В этом случае вы не можете наследовать от VehicleData.например,

public class A
{
    private A() {}
}
public class B : A
{
}

это не скомпилируется.Но если существует открытый или защищенный список аргументов, не являющийся нулевым, вы можете наследовать от класса:

public class A
{
    private A() {}
    public A(int i) {}
}
public class B : A
{
    public B() : base(0) {}
}

Кроме того, если выясняется, что Vehicle имеет только private конструкторы, и вы тольковы хотите добавить специфически поведение, а не какие-либо свойства, которые не могут быть вычислены из тех, которые уже определены в Vehicle, вместо наследования вы можете использовать extesnions-Methodes.

public static VehicleExtesnion
{
    public SomeType DoStuff(this Vehicle vehicle) 
    {
        // do stuff with vehicle
    }
}
0 голосов
/ 23 сентября 2019

Возможно, базовый класс имеет конструктор private , к которому нет доступа.В этом случае вы не можете наследовать класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...