/ / Які хороші шляхи вирішення для відсутності статичної семантики набору тексту Дартса? - дротик

Які хороші обхідні шляхи для відсутності семантики статичного набору дартс? - дартс

Я "походжу з C # / F # / Haskell, тому я" намагаюся придумати рішення проблем програмування, які я використовував для вирішення типів.

  1. клас A, де T: new () в C #, це головним чином, щоб я могла десь робити нове T (). Це створює помилку сформованого типу в Dart. Чи є досить ідіоматичний спосіб вирішити це? Можливо, з фабриками?

  2. Я робив кілька експериментів з міксинами, у випадкуконфлікти імен для успадкованих членів міксину, виграє останній міксин. Отже для наступного: абстрактний клас mixA {void foo (); } абстрактний клас mixB {void foo (); } клас C розширює об’єкт за допомогою mixA, mixB {} новий C (). foo ();

це в кінцевому підсумку викликає mixB.foo (), тоді як клас C розширює об’єкт за допомогою mixB, mixA {} нарешті дзвонить на mixA.foo () Чи є все-таки доступ до членів прихованих міксин?

Припустимо, я змішую 2 міксини з полем того жназва. Чи має екземпляр підкласу 2 поля під час виконання (лише 1 є недоступним) чи об'єкт схожий на словник і є лише 1 слот для кожного імені?

Відповіді:

4 для відповіді № 1

1 це неможливо. Ви не можете телефонувати new на загальний тип (або змінну для цього питання). Найпоширенішим вирішенням є створення закриття, яке замість цього виділяє об'єкт.

Відповіді на 2 випадають з того, що Mixins можна розглядати як суперкласи: A extends Object with B, C в основному еквівалентний:

class B" extends Object { <copy over code inside B> }
class C" extends B" { <copy over code inside C> }
class D extends C" { ... }

Маючи це на увазі:

  • ні. немає способу отримати доступ до прихованих суперелементів.
  • так. ви отримаєте кілька полів.

Маленька примітка: <copy over code inside X> частина є не зовсім коректною, оскільки це змінить область бібліотеки. Код від mixin B концептуально знаходиться в бібліотеці, в якій розміщено mixin.