Я разработал 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 испортится, показывая следующую страницу.
Как избавиться от этого, и моя цель получает выполнил без ущерба для дизайнера ???
Вам нужно будет узнать, почему он рушится. Для этого откройте два экземпляра Visual Studio. Прикрепите отладчик первого экземпляра ко второму экземпляру (через Debug | Attach to process). Во втором случае откройте форму в конструкторе, чтобы произошла ошибка.Теперь первый экземпляр должен прорваться в отладчик, чтобы показать вам код, вызывающий проблему. –
См. Дубликат, о первом результате Google, если вы начнете вводить _ «Дизайнер не может создать абстрактный экземпляр экземпляра» _. Вы также можете просто использовать интерфейс в своих формах, если абстрактный класс не содержит реализацию. – CodeCaster
Вы могли бы сделать это через интерфейсы тоже ... http://i.imgur.com/Ephj3H3.png –