2012-04-19 2 views
3

я потянув меня за волосы на некоторое времяC# Наследуйте класс в форме

Я создал форму, заполненную pictureboxs. Каждый кадр будет содержать событие _click, _mousedown и _mouseup. Я хочу переместить эти события, созданные для формы, в class1.cs, а затем наследует эти события form1.cs.

Я не хочу публиковать изображение box1. так что-то вроде Class1 classOne = new Class1(); pictureBox1.Click + = новый EventHandler (cs.pictureBox1_Click); не будет работать.

Я не уверен, как сделать form1.cs inherit class1.cs. звучит так просто в моей голове, но им только на ментальном пустой

Я устал класса Form1: Form, Class1

в Form1.Designer.cs this.pictureBox1.Click + = новый System.EventHandler (это. pictureBox1_Click); this.pictureBox1_Click не доступно для доступа

Если бы вы могли указать мне в правильном направлении, это будет отличная помощь! Приветствиям

Form1.cs 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
} 

Class1.cs 
class Class1 
{ 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("pb1 click"); 
    } 
} 
+1

C# не поддерживает множественное наследование классов, поэтому ваш Form1 может наследовать от Form или Class1, но не для обоих. Вы можете сделать Class1 наследовать форму, а затем Form1 наследует Class1. – ulty4life

ответ

0

Вам не нужно, чтобы само изображение будки, но вам нужно будет сделать обработчик событий в Class1 общественности, так что они могут быть доступны в другом месте.

На самом деле я не вижу причины, по которой вам нужно конкретно наследовать. Посмотрите here для получения дополнительной информации.

2

Class1 должны наследовать от Form, а затем Form1 унаследует от Class1:

class Class1 : Form 
{ 
    //... 
} 

public partial class Form1 : Class1 
{ 
    //... 
} 

Убедитесь, что все partial декларации наследуют от Class1 и не от Form. (Это, скорее всего, добавит дополнительный шаг для любого автоматически сгенерированного кода, что является классической причиной для классов partial. Возможно, вам понадобится написать для себя собственную автоматизацию.)

Что мне непонятно, так это то, пытаясь достичь путем промежуточного типа между Form и Form1. Предполагается, что Class1 является общей «базовой формой», которую наследуют несколько форм? Или вы пытаетесь сделать что-то еще? Но если вам нужно Form1, чтобы иметь возможность обращаться к членам Class1, не подвергая их воздействию команды public, вы можете сделать это protected.

+0

Я думаю, что он решает ближайшую проблему, но делает долгосрочную проблему еще хуже. –

+0

@ KendallFrey: Очень возможно, да. Я думаю, что ОР должен сделать шаг назад и более четко определить необходимость наследования в этой ситуации. Лично я считаю, что неопытные разработчики сильно переизбирают наследование как инструмент и заканчивают, как это ни парадоксально, очень не объектно-ориентированными проектами. – David

0

Хотите подписаться на новости Form1 от Class1? Попробуйте что-то вроде этого:

//Form1.cs 
public partial class Form1 : Form 
{ 
    Class1 class1; 

    public Form1() 
    { 
     InitializeComponent(); 
     class1 = new Class1(); 
     this.pictureBox1.Click += new EventHandler(class1.pictureBox1_Click); 
    } 
} 

//Class1.cs 
class Class1 
{ 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("pb1 click"); 
    } 
} 

Похоже, что вы пытаетесь сделать, это не удел, а просто уведомляя внешний объект GUI событий. Вы должны переоценить свой код, думая о точно, что вы пытаетесь сделать.

3

Inheritance определяет отношения «is-a», поэтому, если Form1 is-a Class1, то вы не приближаетесь к этому правильным образом.Вы действительно есть несколько вариантов в зависимости от того, что вы пытаетесь разработать:

  1. Передайте форму к экземпляру класса через общедоступный метод, и класс присоединить обработчик событий (это, кажется, больше смысла в этих случаях, если существует несколько форм, разделяющих поведение).

  2. Хранить обычное поведение в самой форме (как особый тип формы, PictureClickingForm), а затем позволить другим формам наследовать от этого. Теперь методы могут быть защищены.

Это вопрос наследования и сдерживания. Гораздо больше информации об этом, когда формулируйте вопрос таким образом.

1

Только так можно добиться, изменив Class1.cs ниже

public partial class Form1 
{ 
    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("pb1 click"); 
    } 
} 
0

Ваш Form1 является класс, так что просто наследуют Form2 из Form1. (Вместо того, чтобы пытаться скопировать части обратно в какой-то новый файл Class1.cs) Form1.designer.cs все еще является частью определения Form1, просто отодвинутого в сторону графического дизайнера форм. Но обратите внимание, что в этом определении нет других частей (даже для дизайнера! Iy's all in there!).

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

Опции: Вы можете создавать свои собственные события в Form1 или создавать abstract или virtual методы обработки событий Form1 с подклассом, таким как Form2.

Помогает ли это?

0

Вы всегда можете использовать интерфейсы. Дело в том, что вы можете наследовать только один класс, но многие интерфейсы ... Поэтому я предполагаю, что вам понадобятся такие интерфейсы - передать методы throught или что-то еще. Вдали от интерфейса вы всегда можете поместить свой класс в качестве параметра в конструктор второго класса Form (используя ключевое слово this), чтобы вы не могли передать значения, методы из предыдущих форм, скажем, другому (например, события).

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