0

我有一个基类BaseCollectionInspector,它有两个派生类:ReactionCollectionInspectorConditionCollectionInspector.

基类有这个方法:

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方法,除了在assetTypeand上进行强制转换newItem

我正在尝试正确学习 C#,并希望使用 DRY 原则,即使复制代码很容易。我想我可能可以使用接口,但我不确定如何设置它,因为我希望该方法仅在基类中,以适应正确的子类。

我也尝试在每个派生类中放置类似的东西,但我找不到一种方法来使用它在基类方法中进行强制转换:

private Type itemType = typeof(BaseReaction);

先感谢您!

4

1 回答 1

0

对我来说效果很好的解决方案是:

  • 创建一个基类,CollectionItem它具有所有相似的属性BaseReactionBaseCondition
  • 创建一个基类,BaseCollection它具有所有相似的属性ReactionCollectionConditionCollection

这样我就可以只引用基类CollectionItemBaseCollection,BaseCollectionInspector并将我想要对派生检查器唯一的所有方法设置为abstract

我确信这对于我正在使用的内容非常具体,但重点是它是可能的,你只需要找到类似类的公共部分,并为其创建一个父类。

感谢您在这里的帮助:)

PS:我真的很喜欢 C#,并且意识到 PHP 在没有任何严格类型的情况下工作是多么令人困惑,即使我已经在其中工作了 20 年左右 :)

于 2019-04-24T22:36:52.197 回答