2015-01-30 5 views
0

Я разработал 3 разных формы выигрыша в C#.Как расширить класс формы на C#?

public partial class SLOSPR : form 
{ 
    public bool IsCallable; 
    public void PopulateData(); 
} 
public partial class SLOFIX : form 
{ 
    public bool IsCallable; 
    public void PopulateData(); 
} 
public partial class SPDBID : form 
{ 
    public bool IsCallable; 
    public void PopulateData(); 
} 

Я открыл один член переменной IsCallable в классе каждой формы и функция-член PopulateData() в классе каждой формы. Это связано с тем, что в сегменте кода я хочу объявить одну переменную типа формы и хочу назначить объект любого из вышеуказанных трех классов и использовать переменную IsCallable и позвонить PopulateData().

так:

public form RetForm() 
{ 
    form frm=new /* constructor of any 3 forms mentioned above*/ 
    //this function can return any of the three types which will be decided at run time. 
    return frm; 

} 
form frm=RetForm(); 

здесь я хочу использовать IsCallable и вызвать PopulateData().

так:

if(frm.Iscallable) 
    frm.PopulateData(); 

Что не возможно синтаксически, как Iscallable и PopulateData не является членом класса формы

Чтобы решить эту проблему, я расширил класс формы для абстрактного класса и объявленную эти 3 формы из расширенного класса.

public abstract class EXTENDED_FORM : form 
{ 
    public bool IsCallable; 
    public abstract void PopulateData(); 
} 

и изменил определение этих трех форм, подобных этому.

public partial class SLOSPR : EXTENDED_FORM 
{ 
    public override void PopulateData() 
    { 
     /*body for SLOSPR */ 
    } 
} 
public partial class SLOFIX : EXTENDED_FORM 
{ 
    public override void PopulateData() 
    { 
     /*body for SLOFIX */ 
    } 
} 
public partial class SPDBID : EXTENDED_FORM 
{ 
    public override void PopulateData() 
    { 
     /*body for SPDBID*/ 
    } 
} 

Теперь я сделал так:

public EXTENDED_FORM RetForm() 
{ 
    EXTENDED_FORM frm=new /* constructor of any 3 forms mentioned above*/ 
    //this function can return any of the three types which will be decided at run time. 
    return frm; 

} 
EXTENDED_FORM frm=RetForm(); 

Теперь я могу назвать так:

if(frm.Iscallable) 
    frm.PopulateData(); 

Автоматически переопределены PopulateData будет называться.

Наконец-то я сделал свою цель. Но, как я изменил

public partial class SLOSPR : form  /*[Designer generated code]*/ 

в

public partial class SLOSPR : EXTENDED_FORM 

Дизайнер GUI в Visual Studio испортится, показывая следующую страницу.

Как избавиться от этого, и моя цель получает выполнил без ущерба для дизайнера ???

+1

Вам нужно будет узнать, почему он рушится. Для этого откройте два экземпляра Visual Studio. Прикрепите отладчик первого экземпляра ко второму экземпляру (через Debug | Attach to process). Во втором случае откройте форму в конструкторе, чтобы произошла ошибка.Теперь первый экземпляр должен прорваться в отладчик, чтобы показать вам код, вызывающий проблему. –

+2

См. Дубликат, о первом результате Google, если вы начнете вводить _ «Дизайнер не может создать абстрактный экземпляр экземпляра» _. Вы также можете просто использовать интерфейс в своих формах, если абстрактный класс не содержит реализацию. – CodeCaster

+0

Вы могли бы сделать это через интерфейсы тоже ... http://i.imgur.com/Ephj3H3.png –

ответ

1

не делает EXTENDED_FORM аннотация; удалить абстракцию из ее декларации и добавить защищенный конструктор без параметров

+0

Это, к сожалению; нам пришлось иметь дело с абстрактными базовыми формами в моей предыдущей компании (устаревший код). Эти проблемы немного неопределенны, иногда решение чистое, закрытие VS и перестройка будут исправлять это, иногда вам нужно было делать это дважды/трижды. Я не уверен, что существует какой-либо допустимый метод обхода - так что я бы пошел с этим ответом. – decPL

Смежные вопросы