Я думаю, вы можете все перепутать.Из приведенных вами примеров я полагаю, что вас могут сбить с толку обработчики событий и тот факт, что они обычно имеют сигнатуру метода вдоль строк void Handler(object sender, EventArgs args)
, где отправитель может быть экземпляром, скажем, Button
.
В ООП типы могут наследоваться от других типов, и вы можете использовать экземпляры унаследованных типов в качестве экземпляров базовых типов, эта концепция называется Полиморфизм .Например, класс Button
наследуется от Object
, где-то вверх по цепочке наследования.Можно сказать, что унаследованный тип - это специализированный тип его базового типа:
class Person { } // Person is our base type
class John : Person {} // John is a specialized kind of Person
Таким образом, вы можете сказать, что при создании экземпляра Джона это также является экземпляромЧеловек:
John john = new John();
Person johnAsPerson = john; // Perfectly fine, makes sense even
Но не наоборот, потому что не все люди John
, некоторые могут быть Steve
или Mary
, некоторые даже могут быть Person
:
Person person = new Person();
John john = person; // Won't work
В тех случаях, когда мы знаем , что это экземпляр John
, мы можем сказать компилятору «не волнуйтесь, я знаю, что я делаю», и явно приведемот Person
до John
:
Foo(new John());
static void Foo(Person person) {
John john = (John)person; // We expect it to always be a instance of John
// If not, the runtime will throw an exception, that we're trying to do an invalid cast
}
Чтобы было ясно, важно различать тип экземпляра и тип переменной:
string a = "123";
// | |-> I'm an instance of the Type `string`
// |-> I'm a variable of type `string`, that points to an instance of type `string`
object o = a;
// |-> I'm a variable of type `object`, that points to an instance of type `string`
Смысл с обработчиками событий заключается в том, что они обычно предоставляют отправляющий экземпляр элемента управления в форме его базового типа Object
.Экземпляр элемента управления все еще очень похож на Button
, но мы просто рассматриваем его как Object
.Для этого вы можете разыграть Object
до Button
.