2012-05-23 2 views
0

У меня есть класс с перегруженными методами.Java - Абстрактный класс с перегруженными методами, вызывающими друг друга

public class MyCal extends GregorianCalendar { 

    //constructor 
    public MyCal(Date date) { 
    super(); 
    setTime(date); 
    } 

    boolean isSameDay(Date date) { 
     return (isSameDay(new MyCal(date))) { 
    } 

    boolean isSameDay(MyCal cal) { 
     if (...) { 
     return true; 
     } else { 
     return false; 
     } 
    } 

    //abstract String toString(String pattern) {}; 
    //if I have this I can't call new MyCal(date) from above 
} 

Теперь я хочу, чтобы класс быть абстрактным (нужны классы суб реализовать несколько других методов), и до сих пор избежать всей логики первого метода isSameDay (вызов второго). Если бы это был именно этот метод, было бы хорошо, я мог бы это сделать, но эта ситуация реплицируется на многие другие перегруженные методы.

Класс, являющийся абстрактным Я не могу его создать, и поэтому метод isSameDay (дата) сообщит об ошибке ... и действительно не хочет иметь логику для всех методов, это сделает класс огромным, как так же сложнее поддерживать. У кого-нибудь есть хороший способ сделать это? Спасибо заранее.

+4

Что ваш вопрос , в точку? Это то, что вы хотите, чтобы сделать этот класс абстрактным и все еще создавать его? – Bohemian

+0

Я тоже не понимаю. Избегайте * какой * логики? –

+1

В чем проблема? Абстрактный метод может определять не абстрактные методы. И эти методы могут быть окончательными, если вы не хотите, чтобы подклассы перекрывали их. –

ответ

2

Я думаю, что он имеет в виду, что он хочет создать экземпляр объекта производного класса в родительском классе.

Я предлагаю делать что-то вроде этого:

Родитель Класс

public class MyCal extends GregorianCalendar { 
(...) 
boolean isSameDay(Date date) { 
    return (isSameDay(newInstance())) { 
    } 
abstract MyCal newInstance(){} 
(...) 
} 

производного класса

public class MyDerivedCal extends MyCal{ 
(...) 
abstract MyCal newInstance(){ 
    return new MyDerivedCal(); 
    } 
(...) 
} 

пардон возможные синтаксические ошибки ява ....

+1

Я думаю, что это решит мою проблему. Я попробую. –

4

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

boolean isSameDay(Date date) { 
    if (...) { 
     return true; 
    } else { 
     return false; 
    } 
} 


boolean isSameDay(MyCal cal) { 
    if(cal == null) return false; 
    return (isSameDay(cal.getTime())); 
} 

Продлить на другие методы по мере необходимости.

+1

+1 Ваш ответ заставил меня понять вопрос :) – pgras

+0

Это не поможет, если пропущенная логика (будь то SameDay) должна вызывать те абстрактные методы. – CKuck

+0

Не уверен, что я следую за вами @CKuck. Вы можете назвать абстрактные методы такими же, как и обычные. – Perception

3

Вы можете определить метод getMyCal(date)

public class MyCal extends GregorianCalendar { 

    abstract MyCal getMyCal(Date date); 

    // further implementation 
} 

и вместо того, чтобы использовать new MyCal(date) вы можете использовать getMyCal(date) в своих методах.

Реализации абстрактного класса должны реализовывать только метод getMyCal.

public ConcreteCal extends MyCal { 

    MyCal getMyCal(Date date) { 
     return new ConcreteCal(date); 
    } 
} 
1

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

Если вы хотите, чтобы сделать этот класс абстрактным, но до сих пор его экземпляр, вы не можете (вы не можете создать экземпляр абстрактного класса), но вы можете сделать это:

public abstract class MyCal ... { 
    ... 
    abstract String toString(String pattern); 
} 

public class MyCalBasic extends MyCal { 
    String toString(String pattern) { 
     // some vanilla impl 
    } 
} 

И просто использовать MyCalBasic вместо MyCal, когда вы хотите «ванильный» версию класса.

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