O ile mi wiadomo, sposób przeciążania działa polega na sprawdzeniu ilości parametrów, które mu dostarczasz, a następnie sprawdza, który z nich musi użyć.
Nie, przeciążanie nie opiera się wyłącznie na liczby parametrów - to na podstawie ich typów też.
Jednakże:
W dwóch konstruktorów są takie same, zarówno akceptuje ciągi
To jest problem. Nie można zadeklarować dwóch konstruktorów tak:
public Foo(string x)
{
}
public Foo(string y)
{
}
podpisy te spotkania miarę przeciążenie jest zaniepokojony.
Proponuję o publiczne statycznych metod fabrycznych, tak można określić to, co starasz się stworzyć:
public static Foo FromGears(string gears)
{
return new Foo(...);
}
public static Foo FromMaximumSpeed(string maxSpeed)
{
return new Foo(...);
}
Można by wtedy ewentualnie mieć jeden konstruktor, który przyjął obie wartości i domyślny, którykolwiek z nich brakuje, gdy wywołujesz konstruktora z metody fabryki.
Jednak istnieją dwa inne osobliwości w opisie:
- Używasz ciągi dla dwóch wartości, które brzmią tak, jak powinny one być numery (ewentualnie jeden numer i jeden Number i -jednostka)
- Mówisz o deklarowaniu konstruktorów, ale używasz słowa "zmień" tak, jakby zamierzały zmienić istniejącą instancję. To nie ma sensu - konstruktorzy służą do tworzenia obiektów nowych.
EDIT: Ok, teraz wiemy nieco więcej, tutaj jest coś takiego mi chodzi:
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);
}
}
pamiętać, że mógł użycie parametry opcjonalne i nazwane argumenty za tym też w 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;
}
}
Następnie:
Car car = new Car(gears: 4);
Car car = new Car(topSpeed: 30);
Nie polecam tego jednak ogólnie - na pewno nie, dopóki jesteś stosunkowo nowy w tym języku. Istnieją różne subtelności wokół opcjonalnych parametrów.
Myślę, że błędnie przeczytałeś zadanie: dlaczego miałbyś przekazywać liczbę biegów (liczbę) lub maksymalną prędkość (także liczbę) jako ciąg? Ale ta obserwacja niekoniecznie rozwiązuje problem. Twoje wątpliwości są zasadniczo poprawne - wątpliwe jest, czy dobry projekt OOP używałby tutaj konstruktorów. –
Czy Twoje * zadanie * umożliwia korzystanie z konstruktorów, czy też to * Twój sposób rozwiązywania * konkretnego zadania? –
Wygląda na to, że brzmi to niejednoznacznie. Nie jestem pewien, czy to możliwe. –