2013-04-10 4 views
0

Я пишу алгоритм, который работает на небольшой серии и выполняет некоторые операции, такие как shift, AND с ним. Я хотел протестировать алгоритм с двумя разными структурами данных: MutableBigInteger и BitString (javabdd), поэтому я подумал, что попытаюсь придумать какой-нибудь умный шаблон дизайна (так как я этого не делаю), и я нашел стратегию разработки узор довольно интересный. Единственное, что меня беспокоит, это то, что для функции И ему нужен тот же тип, который нужно вычислить. Я объясняю с некоторым кодом:Шаблон разработки стратегии (с использованием метода аргументов) - JAVA

тезисов моих два разных класс:

public class MutableBigInteger { 

public void shift(); 
public void and(MutableBigInteger b2){ 
    // ... 
} 
} 


public class BitString { 

public void shift(); 
public void and(BitString b2){ 
    // ... 
    } 
} 

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

while(...) { 
    bittrain.shift(); 
    bittrain.and(bittrain2); 
} 

для меня вопрос, как добиться того, чтобы с помощью функции И, поскольку каждый мой собственный класс ждет того же класса в аргументе. Я думал, что это нравится:

public interface BitTrain { 

public void shift(); 
public void and(BitTrain b2); 

}

и расширить свои два класса с этим интерфейсом, но это не помогает мне, потому что, в MutableBigInteger и битовая я должен сделать бросок , Я действительно не хочу этого (из-за скорости).

Надеясь, я достаточно хорошо это объяснил, желаю вам хорошего дня!

Нико

+0

Я хотел бы предложить исправление названия, потому что ваш вопрос больше об интерфейсах, наследование и дженериков, а не о стратегии. –

ответ

3

Не думаю, что это самый чистый способ, но вы могли бы использовать дженерики:

public interface BitTrain<T extends BitTrain<?>> { 
    public void shift(); 
    public void and(T b2); 
} 

А затем реализовать интерфейс, как:

public class MutableBigInteger implements BitTrain<MutableBigInteger> { 
    public void shift(); 
    public void and(MutableBigInteger b2){ 
     // ... 
    } 
} 
+0

Это не будет работать с битрейтами разных типов, так как 'и()' только за исключением аргументов одного и того же класса. вы не можете относиться ко всем этим как к Bittrains, из-за несоответствия подстановочных знаков. Я добавил ответ, который будет работать. –

+0

@Plantface, как я читал вопрос, OP не хочет комбинировать различные реализации битрейта ... –

+0

@Heuster да это рабочее решение, может быть, не самое чистое, но я думаю, может быть, самый быстрый ...? В любом случае, я действительно =) Вопрос: действительно ли мне нужно поставить BitTrain > Или BitTrain достаточно ..? это просто сделать сюрприз, расширяя bittrain, но это не требуется, не так ли? – Nikkolasg

0

Это звучит как преждевременная оптимизация для меня. Вы уверены, что байт-код checkcast повлияет на вашу общую производительность? Я думаю, что это подпадает под «HotSpot».

+0

Может быть, я не уверен, но, на мой взгляд, это было медленнее, чем просто методы полиморфизма, и мне нужно много делать тезисы, поэтому мне действительно нужен самый быстрый способ. – Nikkolasg

0

Я не понял вопрос полностью, но вы случайно не думая о шаблоне шаблона

public class MyBitOperation<T> { 

T b1; 

public MyBitOperation(T b) { 
    b1= b; 
} 
public void shift(){ 

//TODO: DO something 
} 
public void and(T b2){ 

    //Do somehting else 
} 
+0

Да, это то, что я хочу сделать, но вещи находятся в одной из моих функций (кроме сдвига или «и»). Мне нужно называть «новое», и я не могу сделать это с общим типом ... – Nikkolasg

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