19

Posiadam aplikację Windows Forms programu Visual Studio 2010, która zawiera klasę podstawową Form, którą dziedziczą inne klasy. Konstruktor klasy podstawowej przyjmuje parametr, który klasy potomne przechodzą do klasy bazowej.Jak uniknąć błędu "Konstruktor na typ" MyType "nie został znaleziony" podczas dziedziczenia klasy bazowej

Przykład:

public partial class BaseForm : Form 
{ 
    public BaseForm(int number) 
    { 
     InitializeComponent(); 
    } 
} 

public partial class ChildForm : BaseForm 
{ 
    public ChildForm(int number) 
     : base(number) 
    { 
     InitializeComponent(); 
    } 
} 

Problem, który używam do jest, gdy próbuję otworzyć ChildForm w trybie VisualStudio w widoku projektu pojawia się następujący błąd:

Constructor on type 'MyProject.BaseForm' not found.

Uwaga: niezależnie od błędu projekt kompiluje się i działa poprawnie.

Mogę uniknąć błędu, jeśli przeciążę konstruktora, który nie zawiera żadnych parametrów.

Przykład: (To pozbywa błędu)

public partial class BaseForm : Form 
{ 
    public BaseForm(int number) 
    { 
     InitializeComponent(); 
    } 

    public BaseForm() 
    { 
     InitializeComponent(); 
    } 
} 

public partial class ChildForm : BaseForm 
{ 
    public ChildForm(int number) 
     : base(number) 
    { 
     InitializeComponent(); 
    } 
} 

Moje pytanie jest, w jaki sposób można utworzyć klasy bazowej, która nie zawiera konstruktora bez parametrów i uniknąć widoku projektu błąd?

Odpowiedz

25

To jest całkowicie niemożliwe.

Formularz, który widzisz w widoku projektu, jest rzeczywistą instancją twojej klasy bazowej.
Jeśli nie ma domyślnego konstruktora, projektant nie może utworzyć tej instancji.

Możesz oznaczyć konstruktora za pomocą [Obsolete("Designer only", true)] i sprawić, by zgłaszał wyjątek, jeśli zostanie wywołany, gdy nie jest w projektancie, aby uniemożliwić innym osobom wywoływanie tego konstruktora.

+6

Czy wymagany konstruktor instancji bez parametrów może być "prywatny"? –

+2

@JeppeStigNielsen - Tak. Właśnie to zrobiłem i wszystko jest w porządku. – Jed

+0

Upewnij się, że kompilujesz projekt, w którym znajduje się klasa podstawowa, jeśli jest ona inna niż klasa dziedziczona. –