Как я смогу вызвать функцию из объекта независимо от его типа?C#

Место общения программистов C#
Ответить
Anonymous
 Как я смогу вызвать функцию из объекта независимо от его типа?

Сообщение Anonymous »

В настоящее время я изучаю Godot, следуя учебнику, но переводя код GScript на C#. Учебное пособие, о котором идет речь, находится здесь:
Я нахожусь в главе о наследовании, где он создает родительскую сцену ItemContainer и две сцены, которые наследуются от него: туалет и коробка.
Мой код для трех классов такой:

Код: Выделить всё

using Godot;
using System;

public partial class ItemContainer : StaticBody2D
{
public virtual void Hit()
{
GD.Print("Ow");
}
}

Код: Выделить всё

using Godot;
using System;

public partial class toilet : ItemContainer
{
public override void Hit()
{
GD.Print("Toilet");
}
}

Код: Выделить всё

using Godot;
using System;

public partial class box : ItemContainer
{
public override void Hit()
{
GD.Print("Box");
}
}
Из более ранней части руководства у меня есть враг-дрон-заполнитель, у которого также есть метод Hit(), все, что он сейчас делает, это печатает «удар дрона», однако этот класс дронов этого не делает. наследуется от класса контейнера элемента.
Метод hit вызывается классом laser, который на данный момент выглядит следующим образом:

Код: Выделить всё

using Godot;
using System;

public partial class laser : Area2D
{
[Export] public float Speed = 750f;
public Vector2 direction;
public override void _Process(double delta)
{
this.Position += direction * (float)delta * Speed;
}

public void onCollision(Node2D body)
{
if (body.HasMethod("Hit")) ((drone)body).Hit();
QueueFree();
}

public void onTimeout()
{
QueueFree();
}
}

При вызове метода удара мне пришлось бросить тело в дрон, чтобы VSCode мог увидеть, что у объекта действительно есть метод удара. Это довольно раздражает, поскольку я уже проверяю, есть ли у объекта метод hit, но Godot не будет строиться без приведения. Однако приведение вызывает проблемы, поскольку при съемке контейнера с предметами он не может быть передан дрону и поэтому не запускается.
Я хотел бы знать, есть ли в C# способ просто запустите метод независимо от класса объекта или даже простой способ привести объект к типу объекта, не зная об этом заранее. Я нашел решение: изменил код лазера на:

Код: Выделить всё

public void onCollision(Node2D body)
{
if (body.HasMethod("Hit"))
{
if (body is drone drn) drn.Hit();
else if (body is ItemContainer itemC) itemC.Hit();
}
QueueFree();
}

Хотя на данный момент это работает нормально, я хотел бы знать, есть ли более простой способ запустить Hit, потому что, если есть еще больше типов классов, которые можно поразить, оператор if мог бы получить скорее долго и нудно. В любом случае совет о том, как его упростить, очень ценен!

Подробнее здесь: https://stackoverflow.com/questions/788 ... f-its-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»