Как привести разные типы в методе производного класса? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть базовый класс BaseCollectionInspector, который имеет два производных класса: ReactionCollectionInspector и ConditionCollectionInspector.

Базовый класс имеет этот метод:

protected override void AddItem(object obj) {
    AssetInfo assetInfo = (AssetInfo) obj;
    string assetName = Path.GetFileNameWithoutExtension(assetInfo.assetPath);
    var assetType = Type.GetType(typeof(BaseReaction).Namespace + "." + assetName + ", Assembly-CSharp");
    var newItem = (BaseReaction) collection.gameObject.AddComponent(assetType);
    newItem.showItem = false; // Hide script in inspector
    int index = collectionList.serializedProperty.arraySize++;

    collectionList.serializedProperty.GetArrayElementAtIndex(index).objectReferenceValue = newItem;
    serializedObject.ApplyModifiedProperties();
}

Разница между двумя производными типами заключается в том, что один содержит список BaseReaction, а другой BaseCondition, у обоих из которых есть свойство showItem.

Они оба будут использовать один и тот же метод AddItem, за исключением наложения на assetType и newItem.

Я пытаюсь выучить C # правильно и хочу использовать принцип СУХОГО, даже если просто скопировать код. Я думаю, что я мог бы использовать Интерфейс, но я не уверен, как бы это настроить, так как я хочу, чтобы метод был только в базовом классе, адаптируясь к правильному подклассу.

Я также пытался поместить что-то подобное в каждый из производных классов, но не могу найти способ использовать это для приведения в методе базового класса:

private Type itemType = typeof(BaseReaction);

Заранее спасибо!

1 Ответ

0 голосов
/ 25 апреля 2019

Решение, которое очень хорошо сработало для меня, было:

  • Создайте базовый класс CollectionItem, из которого получены как BaseReaction, так и BaseCondition, у которого все свойства были похожи
  • Создайте базовый класс BaseCollection, из которого были получены ReactionCollection и ConditionCollection, все свойства которого были похожи

Таким образом, я мог бы просто ссылаться на базовые классы CollectionItem и BaseCollection в BaseCollectionInspector и установить для всех методов, которые я хочу, чтобы они были уникальными для производных инспекторов, значение abstract

Я уверен, что это довольно специфично для того, с чем я работал, но главное в том, что это возможно, вам просто нужно найти общие части похожих классов и сделать его родительским классом.

Спасибо за вашу помощь здесь:)

PS: я действительно люблю C # и понимаю, как сбивает с толку PHP - работать без какой-либо строгой типизации, даже если я проработал в нем 20 лет или около того:)

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