2013-04-20 39 views
5

को कार्यान्वित करने के लिए कैसे मैं जावा कोड को डार्ट पर नीचे पोर्ट करने की कोशिश कर रहा हूं और ऐसा करने के बारे में परेशान हूं।Iterable <E>

जावा में Iterable इंटरफेस है जहां एक विधि के साथ साफ है और इसे लागू करने के लिए एक स्नैप है।

यह कोड डार्ट में सबसे अच्छा कैसे परिवर्तित किया गया है?

/** 
* 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); 
} 

... 

उत्तर

1

इसलिए मैंने यह कोशिश की जो कि मैं चाहता हूं कि मैं बेस क्लास का विस्तार नहीं करना चाहता हूं।

/** 
* 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

यदि आप बेस क्लास का विस्तार नहीं करना चाहते हैं, तो मिक्सिन क्लास में मिलाएं। –

6

IterableMixin का उपयोग कर आप केवल iterator समारोह को लागू करने की जरूरत है।

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

मिक्सिन पर एक संक्षिप्त परिचय के लिए http://blog.sethladd.com/2013/03/first-look-at-dart-mixins.html पर जाएं।

Iterator -इंटरफेस सीधे आगे है। आपको केवल moveNext और गेटर current फ़ंक्शन को लागू करना होगा।

+1

अब कूल मैंने कुछ नया सीखा! बहुत बहुत धन्यवाद ... –

संबंधित मुद्दे