same zasady, z wyjątkiem ...
Jest to właściwie nie różni się od standardowych zasad dostępu członkach innego członka klasy bazowej.
Konstruktor to niewiele więcej niż zwykła funkcja.
Podstawową różnicą jest to, że klasa pochodna automatycznie próbuje wywołać konstruktora podstawowego. W szczególności konstruktor bazowy, który nie przyjmuje parametrów.
Jeśli nie istnieje żaden konstruktor, pojawi się błąd. Jeśli istnieje, ale nie masz "pozwolenia", aby uzyskać do niego dostęp, pojawi się błąd.
Jeśli nie określisz żadnych konstruktorów dla klasy bazowej, zakłada się, że ta klasa ma konstruktor bez parametrów, który nic nie robi.
Innymi słowy, jeśli nie zostanie określony konstruktor, zostanie on niejawnie utworzony.
Oto 7 przykłady, kiedy będzie i nie będzie zmierzyć się z tym problem:
Przykład 3 - OK - Implikowane domyślny pusty konstruktor
class Base
{
// No constructor explicitly defined so a default constructor is assumed
// Having no constructor at all is like having an empty constructor
// Like this: Base() { }
}
class Derived : Base
{
// OK - Explicitly calling accessible base constructor
public Derived() { }
}
Przykład 2 - OK - Dostępna podstawa konstruktor
class Base {
// "public" so it's accessible by derived class
public Base() { } // no parameters - aka parameterless
}
class Derived : Base {
// OK - implicitly calls accessible parameterless constructor base()
public Derived() {}
}
Przykład 3 - OK - Zabezpieczone środki nadal dostępne
class Base {
// "protected" so it's accessible by derived class
protected Base() { } // no parameters - aka parameterless
}
class Derived : Base {
// OK - implicitly calls accessible parameterless constructor base()
public Derived() {}
}
Przykład 4 - FAIL - prywatny nie jest dostępny
class Base {
// "private" so it's NOT accessible by derived class
private Base() { } // no parameters - aka parameterless
}
class Derived : Base {
// FAIL - tries to implicitly call parameterless constructor base()
// ERROR CS0122 - Base.Base() is inaccessible due to it's protection level
public Derived() { }
}
Przykład 5 - FAIL - Zawsze stara się wywołać konstruktora bez parametrów
class Base {
// "private" so it's NOT accessible by derived class
private Base() { } // no parameters - aka parameterless
// "protected" so it's accessible by derived class
protected Base(int a) { } // has parameter - aka NOT parameterless
}
class Derived : Base {
// FAIL - STILL tries to implicitly call parameterless constructor base()
// ERROR CS0122 - Base.Base() is inaccessible due to it's protection level
public Derived() { }
}
Przykład 6 - NIEPOWODZENIE - Chyba, że nie istnieje, wówczas zakłada wywołanie innego
class Base
{
// notice there is not parameterless constructor
// just one constructor does does have parameters
// "protected" so it's accessible by derived class
protected Base(int a) { } // has parameter - aka NOT parameterless
}
class Derived : Base
{
// FAIL - STILL tries to implicitly call parameterless constructor base() which doesn't exist
// ERROR CS7036 - There is no argument given that corresponds to the required formal parameter 'a' of Base.Base(int)
public Derived() { }
}
Przykład 7 - OK - chyba zadzwonić samemu
class Base
{
// "private" so it's NOT accessible by derived class
private Base() { } // no parameters - aka parameterless
// "protected" so it's accessible by derived class
protected Base(int a) { } // has parameter - aka NOT parameterless
}
class Derived : Base
{
// OK - Explicitly calling accessible base constructor with `int` parameter
public Derived()
: base(10)
{ }
}
Ale w jaki sposób wskazuje to na przypadek, w którym * podklasa jest zmuszona do użycia podstawowego słowa kluczowego *? – Veverke
@Veverke - czy próbowałeś dodać ten konstruktor do swojej klasy 'X'? Jeśli tak, powinieneś zacząć otrzymywać błędy kompilatora. –
@Damien_The_Unbeliever: dodanie takiego konstruktora zmusza mnie do zmiany aktualnego konstruktora Y, aby otrzymać również parametr in - lub alternatywnie do dodania konstruktora bez parametrów do X. Lub - mógłbym tylko dodać wywołanie base (0) do prądu Y konstruktor. W ostatnim przypadku * zostałem zmuszony do użycia podstawowego słowa kluczowego * (które jest jedynym pytaniem), chociaż nie ma sensu wywoływać konstruktora, który wymaga parametrów, których nie masz. Przynajmniej ten trzeci scenariusz, z 3, ilustruje ** jest zmuszony do użycia podstawowego słowa kluczowego **. – Veverke