2015-08-28 5 views
2

Привет, я работаю с единством 3D, создавая свои собственные сети с помощью lidgren.Можно запретить классу для детей определять класс?

У меня была эта проблема один раз, когда я сделал пользовательский gui для меня, но не был большой проблемой. Небольшое предупреждение для другого разработчика было небольшой помощью.

Но на этот раз мне нужно лучшее решение.

Допустим, у меня есть BaseClass и ребенка:

public class BaseClass : MonoBehavior { 
    void Update() { 
     //my connectionhandler 
    } 
} 

public class Child : BaseClass { 

    // forbid it to define Update 
    void Update() { 

    } 

    // or let him use it but without writing base.Update() it should still use BaseClass Update() 

} 

Как вы видите, в обоих классах у меня есть пустое Update(). Эта проблема заключается в том, что ребенок также использует void Update, поэтому базовое обновление больше не вызывается. Можно избежать этого. Пример ограничить доступ к методу обновления, если база уже определила его? Или можно дать ребенку определение определения void Update(), но базовый класс также должен иметь возможность использовать собственное Update() (фоновая работа: P)

Другой разработчик не должен использовать каждый раз base.Update() , Я уверен, что они забудут это много раз :)

+0

Вы бы добавили загерметизированный в meathod –

+0

Вы рассмотрели возможность добавления событий к методу Update вместо этого? Разрешить пользователям добавлять обработчики событий BeforeUpdate и AfterUpdate для запуска настраиваемого кода, но само обновление всегда будет работать? – Eris

+0

Нет, если бы я тогда дал бы им использовать base.Update() :). Проблема состоит в единстве. Я не заметил, что Update() работает как функция, определенная пользователем. Я не могу этого предотвратить. Теперь я думаю о потоках. Но это не так безопасно. – MaZy

ответ

0

Вы ищете ключевое слово sealed, которое предотвращает переопределение класса с производным от virtual.

+0

К сожалению, Mono не определяет 'Update()' как виртуальный метод, он вообще не определен и фактически использует отражение для вызова функции «Update()». –

+0

@ScottChamberlain: Интересно. Будет ли «частная» работа? (они пропускают 'BindingFlags.NonPublic'?) – SLaks

+0

Да, [он делает] (http://answers.unity3d.com/questions/33828/public-or-private.html). –

0

Это некрасиво, но вы можете справиться с ним с проверкой времени выполнения. Как было реализовано, он будет работать только при сборке отладки, но это должно означать, что разработчики получат сообщение об ошибке, если они хотя бы запускают собственный код.

public class BaseClass : MonoBehavior { 
    void Update() { 
     //my connectionhandler 
    } 

    public BaseClass() { 
     Debug.Assert(!OverridesUpdateMethod(), "Do not override Update()!"); 
    } 

    [Debug] 
    private bool OverridesUpdateMethod() { 
     return GetType() != typeof(BaseClass) && 
       GetType().GetMethod("Update", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) != null; 
    } 
} 
+0

Круто спасибо. Я проверю это. К сожалению, я сделал уже один с потоками (больше с таймером и интервалами). Он работает хорошо, но его тоже уродливо :) – MaZy

 Смежные вопросы

  • Нет связанных вопросов^_^