2012-03-02 3 views
6

Итак, в школе у ​​нас есть задание сделать машину в ООП, до сих пор ее было довольно легко и прямо. Но теперь мне нужно создать четыре конструктора, один без параметров, два с одним параметром и один с двумя параметрами.Несколько конструкторов с одним параметром

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

Есть ли способ сделать это, не передавая дополнительный параметр?

+0

Я думаю, что вы неправильно поняли назначение: зачем вы передавали количество передач (число) или максимальную скорость (также число) в виде строки? Но это наблюдение не обязательно решает проблему. Ваши сомнения в основном правильны - сомнительно, будет ли хороший дизайн ООП использовать здесь конструкторы. –

+0

Является ли ваше * присваивание * использовать конструкторы, или это * ваш способ решения * конкретного задания? –

+0

Похоже, это вызовет двусмысленность. Не уверен, что это возможно. –

ответ

12

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

Нет, перегрузка не основываются исключительно на числе параметров - это основано на их типов тоже.

Однако:

В двух конструкторах одни и те же, и принимает строки

Это проблема. Вы не можете объявить два конструктора, как это:

public Foo(string x) 
{ 
} 

public Foo(string y) 
{ 
} 

Эти подписи конфликтовать, насколько перегрузкой обеспокоен.

я предложил бы иметь общественные статические фабричные методы, так что вы можете указать, что вы пытаетесь создать:

public static Foo FromGears(string gears) 
{ 
    return new Foo(...); 
} 

public static Foo FromMaximumSpeed(string maxSpeed) 
{ 
    return new Foo(...); 
} 

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

Однако, есть две другие странности в описании:

  • Вы используете строки для двух значений, которые звучат как они должны быть числа (или, возможно, один номер и один number- и-unit)
  • Вы говорите об объявлении конструкторов, но затем используете слово «изменить», как будто они собираются изменить существующий экземпляр. Это не имеет смысла - конструкторы используются для создания новых объектов.

EDIT: Хорошо, теперь мы знаем немного больше, вот такая вещь, я имею в виду:

public class Car 
{ 
    private const int DefaultGears = 5; 
    private const int DefaultTopSpeed = 180; 

    private readonly int gears; 
    private readonly int topSpeed; 

    public Car(int gears, int topSpeed) 
    { 
     this.gears = gears; 
     this.topSpeed = topSpeed; 
    } 

    public static Car CreateWithGears(int gears) 
    { 
     return new Car(gears, DefaultTopSpeed); 
    } 

    public static Car CreateWithTopSpeed(int topSpeed) 
    { 
     return new Car(topSpeed, DefaultGears); 
    } 
} 

Обратите внимание, что вы могли использовать необязательные параметры и именованные аргументы для этого тоже в C# 4 :

public class Car 
{ 
    public const int DefaultGears = 5; 
    public const int DefaultTopSpeed = 180; 

    private readonly int gears; 
    private readonly int topSpeed; 

    public Car(int gears = DefaultGears, int topSpeed = DefaultTopSpeed) 
    { 
     this.gears = gears; 
     this.topSpeed = topSpeed; 
    } 
} 

Тогда:

Car car = new Car(gears: 4); 
Car car = new Car(topSpeed: 30); 

Я бы не рекомендовал это вообще, хотя, конечно, не пока вы еще относительно новичок в этом языке. Существуют различные тонкости вокруг необязательных параметров.

+0

Ye, я имел в виду цифры, мои плохие. Идея состоит в том, чтобы создать конструктор по умолчанию, который делает максимальную скорость автомобиля 180 км/ч и имеет 5 передач. чем мне нужен другой constuctor, у которого есть параметр, который изменяет количество передач и другой конструктор, который изменяет максимальную скорость с помощью параметра. По какой-то причине мне нужно сделать эти конструкторы, а не использовать их как методы. – Gideon

+2

@ Gideon: Вызов, что «изменение» максимальной скорости немного запутанно - это * указание * максимальной скорости. Вы не можете изменить то, чего еще не существует! Тем не менее, похоже, что остальная часть моего ответа уместна. –

+0

Если бы я использовал метод статических методов фабрики. Это просто изменение количества целого числа после создания объекта? Если так, то я использую сейчас. – Gideon

1

Перегруженные методы (и конструкторы) должны отличаться в их сигнатуре. Это означает, что у них должно быть другое количество параметров или параметров, имеющих другой тип (или оба). Имена параметров не учитываются. Это означает, что у вас не может быть двух конструкторов, имеющих один строковый параметр.

Конструкторы не могут ничего менять, кроме как инициализировать объект. Если вы хотите изменить значение, подумайте о добавлении метода, например ChangeGears(string gears).

1

Вкратце нет. Конструкторы зависят не только от количества параметров, но и от их типов.

public Car(string gears) 
{ 

} 

public Car(string maxSpeed) 
{ 

} 

Вы не можете назвать это, потому что они, по существу, тот же конструктор, думать об этом, когда вы передаете в строке, это значение, которое вы передаете, так что компилятор не имеет понятия, какой конструктор для использования: если вы хотите установить количество передач на 6 или максимальную скорость до 6, вызов будет по-прежнему new Car("6"), вроде бы неоднозначный, не так ли?

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

Глядя на то, что вы прокомментировали в других ответах, заставляет меня поверить, что что-то подобное может сработать для вас, однако трудно точно знать, что именно хочет ваша домашняя работа.

public Car() 
{ 
    ... // Do your setting of your default values here (# of gears, max speed) 
} 

public Car(int n) 
{ 
    if(n > 10) 
    { 
     // Use n to set your max speed 
    } else { 
     // Use n to set your # of gears 
    } 
} 

Это кажется маловероятным, что автомобиль будет обладать более 10 передач, или что его максимальная скорость будет меньше, чем 10, так что в этом случае вы можете использовать один конструктор для установки как ваши # шестерен и верхних скорость. (Имейте в виду, что вы спросили, что это, вероятно, не ответит на вашу домашнюю работу, но было бы достаточно, чтобы ИМО использовал конструктор, который может устанавливать максимальную скорость и количество передач без добавления другого параметра, предполагая, что у вас есть какая-то гарантия, что скорость машины максимум составляет> = 10 и число шестерен < 10)

+0

Итак, я просто должен был бы сделать private int gears = 5; как по умолчанию в constuctor, и сделать функцию, которая меняет это? Потому что это то, что у меня есть сейчас. Возможно, это ошибка в описании. – Gideon

+0

@ Gideon Отредактировано, чтобы отразить идею, имейте в виду, что этого, вероятно, недостаточно, чтобы ответить на вашу домашнюю работу. – NominSim

0
public Car(string param, bool isGear) 
{ 
    if(isGear) 
     gears = param; 
    else 
     maxSpeed = param; 
} 
+0

Думал об этом, но идея состоит в том, чтобы передать только один параметр, и, таким образом, его 2. – Gideon

1

Каждый метод (в том числе и конструкторами) имеет подпись. Подпись состоит из параметра Виды и их заказать. У вас не может быть двух методов, которые имеют одно и то же имя и подпись.

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

public class Car 
{ 
    public Car(int gears) {} 
    public Car(float maxSpeed) {} 
} 
Смежные вопросы