2013-04-20 14 views
5

Aşağıdaki Java kodunu Dart'a aktarmaya çalışıyorum ve bunu yapmak için şaşırıyorum.Nasıl Yapılır Değiştirilebilir <E>

Java'da yinelenebilir arabirim, tek bir yöntemle temiz olduğu yerdir ve bunu uygulamak bir ek işlevdir.

Bu kod Dart'a en iyi nasıl dönüştürülür?

/** 
* Chess squares represented as a bitmap. 
*/ 
public class ChessSquares implements Iterable<ChessSquare> { 

private static class ChessSquaresIterator implements Iterator<ChessSquare> { 
    long bits; 
    int nextBit; 

    public ChessSquaresIterator(long bits) { 
     this.bits = bits; 
     nextBit = Long.numberOfTrailingZeros(bits); 
    } 

    @Override 
    public boolean hasNext() { 
     return (nextBit < 64); 
    } 

    @Override 
    public ChessSquare next() { 
     ChessSquare sq = ChessSquare.values()[nextBit]; 
     bits = bits & ~sq.bit; 
     nextBit = Long.numberOfTrailingZeros(bits); 
     return sq; 
    } 

    @Override 
    public void remove() { 
     throw new UnsupportedOperationException(); 
    } 
} 


@Override 
public Iterator<ChessSquare> iterator() { 
    return new ChessSquaresIterator(bits); 
} 

... 

cevap

1

Soo Denediğim bir şey değil, çünkü bir temel dersi genişletmek istemiyorum.

/** 
* Chess squares represented as a bitmap. 
*/ 
class ChessSquares extends IterableBase<ChessSquare> { 

    Iterator<ChessSquare> get iterator { 
    return new ChessSquaresIterator(this); 
    } 

    ... 

} 

class ChessSquaresIterator extends Iterator<ChessSquare> { 
    int _nextBit; 
    int64 _bits; 
    ChessSquare _current; 

    ChessSquaresIterator(ChessSquares squares) { 
    _bits = new int64.fromInt(squares._bits); 
    } 

    bool moveNext() { 
    _nextBit = _bits.numberOfTrailingZeros(); 
    if (_nextBit < 64) { 
     _current = ChessSquare.values()[_nextBit]; 
     _bits = _bits & ~_current.bit(); 
    } else { 
     _current = null; 
    } 
    return _nextBit < 64; 
    } 

    E get current => _current; 
} 
+2

Bir temel sınıfı genişletmek istemiyorsanız, Mixin sınıfını karıştırın. –

6

IterableMixin kullanarak, yalnızca iterator -Fonksiyon uygulamak gerekir.

class ChessSquares extends Object with IterableMixin<ChessSquare> { 
    Iterator<ChessSquare> iterator() => new ChessSquaresIterator(bits); 
    ... 
} 

Mixins üzerinde kısa tanıtımı için ziyaret http://blog.sethladd.com/2013/03/first-look-at-dart-mixins.html.

Iterator -interface düz ileri doğru. Sadece moveNext işlevini ve alıcıyı current uygulamanız gerekir.

+1

Şimdi havalı Yeni bir şey öğrendim! Çok teşekkürler ... –

İlgili konular