Я пытаюсь сравнить тип класса, переданный как объект, с типом класса на другой стороне, где находится метод.
Как я могу это сделать?
У меня это пока есть.
С одной стороны:
TechToday techToday = new TechToday();
SoftwareRevolution softwareRevolution = new SoftwareRevolution();
Subcriber s1 = new Subcriber();
s1.Subcribe(techToday);
s1.Subcribe(softwareRevolution);
Обратная сторона:
class Subcriber
{
TechToday tt = new TechToday();
SoftwareRevolution sr = new SoftwareRevolution();
public void Subcribe(Object s)
{
if (s==tt)
new ConsoleObserver(s);
else
new ConsoleOutput(s);
}
}
Вместо if (s == tt) сделать if (s is TechToday) { new ConsoleObserver (s as TechToday); }
@RufusL код сбивает с толку, думаю, вы правы.
@maccettura Метод одновременно обрабатывает только одну подписку. Он должен сделать это, получив один «объект» в качестве параметра, а затем определив, является ли этот объект классическим или субъектом событий. Я все еще новичок в этом шаблоне кода, поэтому его метод проб и ошибок для меня
Для меня это не имеет особого смысла. Созданные объекты (ConsoleObserver и ConsoleOutput) выйдут из области видимости, когда Subscribe вернется ... И что это: вы хотите сравнить типы или экземпляры?
@Cleaven Я все еще думаю, что тебе лучше использовать перегрузку
@maccettura Я выполняю инструкции задания
Что за находятся "инструкция о назначении"?
@Cleaven Тогда я мог бы предложить найти новый курс, это не то, как вы обычно справляетесь с этим в реальном мире





Вы можете использовать оператор is, чтобы проверить, принадлежит ли объект этому конкретному типу, например:
if (s is TechToday)
new ConsoleObserver(s);
или вы можете сделать что-то вроде:
if (s.GetType() == typeof(TechToday))
если вы хотите обеспечить равенство объектов, вам нужно сначала проверить его тип, а затем указать ссылку на этот конкретный тип, а затем проверить равенство примерно так:
if (s is TechToday)
{
TechToday tt2 = s as TechToday;
if (tt2 == tt)
new ConsoleObserver(tt2);
}
или вы также можете сделать это так:
TechToday tt2 = s as TechToday;
if (tt2 == tt)
new ConsoleObserver(tt2);
Другой вариант - использовать новую функцию сопоставления с образцом C# 7:
if (s is TechToday tt2)
{
if (tt2 == tt)
new ConsoleObserver(tt2);
}
Кстати, if (s is TechToday) { TechToday tt2 = s as TechToday избыточен, вы, конечно, можете использовать TechToday tt2 = s as TechToday; if (tt2 != null)... или сопоставление с образцом.
да @ vc74, и нам не нужна нулевая проверка, если сравнение предназначено, оно вернет false, если какое-либо из них равно нулю
Большое спасибо за Вашу помощь :)
рад что помог! :)
Вы можете использовать оператор is:
class Subcriber
{
public void Subcribe(Object s)
{
if (s is TechToday)
new ConsoleObserver(s);
else
new ConsoleOutput(s);
}
}
Однако использование "as" может быть лучше:
class Subcriber
{
public void Subcribe(Object s)
{
var tt = s as TechToday;
if (tt!=null)
// unlike above
// value passed to ConsoleObserver is TechToday
// casted already
new ConsoleObserver(tt);
else
new ConsoleOutput(s);
}
}
Я бы посоветовал по возможности использовать перегрузки:
class Subcriber
{
public void Subcribe(TechToday s)
{
new ConsoleObserver(s);
}
public void Subcribe(SoftwareRevolution s)
{
new ConsoleOutput(s);
}
}
Если вам нужно остаться с object в сигнатуре Subscribe, вы, вероятно, захотите использовать что-то вместе
if ( s is TechToday ) { new ConsoleObserver(s); }
Но в конце концов, это не имеет большого смысла, потому что как есть, созданные объекты выйдут из области видимости сразу после выхода из Subscribe.