2011-10-07 13 views
42

Ulepszam konstruktorów, usuwając niektórych pustych konstruktorów. Jestem całkiem nowy w dziedziczeniu i byłam zakłopotana błędem, który dostałam: Klasa podstawowa nie zawiera konstruktora bez parametrów. Jak mogę sprawić, by A2 dziedziczyło z A bez pustego konstruktora w A. Ponadto, dla mojego osobistego zrozumienia, dlaczego A2 wymaga pustego konstruktora dla A?Klasa podstawowa nie zawiera konstruktora bez parametrów?

Class A{ 
    //No empty constructor for A 
    //Blah blah blah... 
} 

Class A2 : A{ 
    //The error appears here 
} 
+2

nie można utworzyć obiekt klasy bez konstruktora. jeśli nie chcesz tego bez parametrów, stwórz konstruktor, który akceptuje niektóre parametry. –

+0

Powinny być bardziej jasne w OP, zarówno klasy A jak i A2 mają konstruktory z parametrami, chciałem tylko usunąć te bez parametrów, aby utworzyć instancję klasy, potrzebujesz wszystkich niezbędnych parametrów dla klasy, aby praca. Wydaje się, że to intuicyjna rzecz, czy jest to sprytny sposób robienia rzeczy? – sooprise

Odpowiedz

78

W klasie A2 należy upewnić się, że wszystkie konstruktory wywołują konstruktor klasy podstawowej z parametrami.

W przeciwnym razie kompilator przyjmie, że chcesz użyć konstruktora klasy bez parametrów, aby skonstruować obiekt A, na którym oparty jest obiekt A2.

Przykład:

class A 
{ 
    public A(int x, int y) 
    { 
     // do something 
    } 
} 

class A2 : A 
{ 
    public A2() : base(1, 5) 
    { 
     // do something 
    } 

    public A2(int x, int y) : base(x, y) 
    { 
     // do something 
    } 

    // This would not compile: 
    public A2(int x, int y) 
    { 
     // the compiler will look for a constructor A(), which doesn't exist 
    } 
} 
+2

Nigdy wcześniej tego nie widziałem, ale tak właśnie było. Dziękuję bardzo! – sooprise

+0

Wyjaśnia, że ​​możesz zignorować konstruktora bez parametrów, jeśli ustawisz inne konstruktory do używania konstruktora bazowego z parametrami. TO ZNACZY. druga definicja w A2 jest jedyną wymaganą. – Tyeth

+0

@Tyeth True! Ale każdy konstruktor musi jawnie wywoływać konstruktor klasy podstawowej, jeśli nie ma konstruktora bez parametrów w klasie bazowej. Jeśli nie podano konstruktora podstawowego, kompilator spróbuje znaleźć konstruktora bez parametrów w klasie bazowej. –

2

Jeśli klasa bazowa nie posiada konstruktora bez parametrów, należy zadzwonić pod jeden z klasy pochodnej przy użyciu base kluczowe:

class A 
{ 
    public A(Foo bar) 
    { 
    } 
} 

class A2 : A 
{ 
    public A2() 
     : base(new Foo()) 
    { 
    } 
} 
8

Przykład:

class A2 : A 
{ 
    A2() : base(0) 
    { 
    } 
} 

class A 
{ 
    A(int something) 
    { 
     ... 
    } 
} 
+0

To jest powszechne i łatwiejsze do odczytania, aby najpierw umieścić klasę podstawową. –

+1

Bardziej powszechne jest umieszczanie klasy bazowej w innym pliku. – Joe

1

To ma zadzwonić jakiś konstruktor. Wartość domyślna to połączenie z base().

Można również użyć statycznych metod, literałów i dowolnych parametrów do bieżącego konstruktora w połączeniach z base().

public static class MyStaticClass 
    { 
     public static int DoIntWork(string i) 
     { 
      //for example only 
      return 0; 
     } 
    } 

    public class A 
    { 
     public A(int i) 
     { 
     } 
    } 

    public class B : A 
    { 
     public B(string x) : base(MyStaticClass.DoIntWork(x)) 
     { 
     } 
    } 
0

podczas tworzenia przedmiotowi klasa pochodna, twój konstruktor klasy podstawowej zostanie wywołany automatycznie. W chwili tworzenia obiektu klasy pochodnej, a obiekt klasy pochodnej nie ma konstruktora przyjmującego jeden lub więcej argumentów, nie będzie nic do przekazania konstruktorowi klasy podstawowej, który chce argument. tak, aby to zrobić, trzeba przekazać coś do konstruktora klasy bazowej w następujący sposób:

Class A{ 
    //No empty constructor for A 
    //Blah blah blah... 
} 

Class A2 : A{ 
    public A2():base(some parameter) 
} 
Powiązane problemy