Wykorzystywanie tej samej metody w wielu klasach lecz z innymi zmiennymi

0

Witam.
Co mam zrobić jeżeli w wielu klasach używam tej samej metody tylko typy zmiennych są inne?

Przykład:

public abstract class Skill {

    private final SkillType skillType;

    public Skill(SkillType skillType) {
        this.skillType = skillType;
    }

    public SkillType getSkillType() {
        return skillType;
    }

}
public class FireSkill extends Skill {

    public FireSkill(SkillType skillType) {
        super(skillType);
    }

    public void use(User user, Location location) {
        //use skill using user and location variable.
    }
}

public class WaterSkill extends Skill {

    public WaterSkill(SkillType skillType) {
        super(skillType);
    }

    public void use(User user, Block block) {
        //use skill using user nad block variable.
    }

}

Czy do każdej klasy mam dopisywać use(potrzebne obiekty) czy jest jakiś sposób wykorzystując np. interfejsy

1

Możesz w abstract klasie stworzyć generyczną metodę

public void use(User user, T object) {
        
    }

A kolejne klasy które będą rozszerzały abstrakta, w swojej deklaracji klasy będą musiały podać odpowiedni typ. Dobrze też by było, jakby te wszystkie typy które zamierzasz użyć, miały coś wspólnego, wtedy w abstrakcie będziesz mógł ograniczyć możliwości typu generycznego:

public abstract class Skill<T extends BaseClass> {
...
0
Pinek napisał(a):

Możesz w abstract klasie stworzyć generyczną metodę

public void use(User user, T object) {
        
    }

A kolejne klasy które będą rozszerzały abstrakta, w swojej deklaracji klasy będą musiały podać odpowiedni typ. Dobrze też by było, jakby te wszystkie typy które zamierzasz użyć, miały coś wspólnego, wtedy w abstrakcie będziesz mógł ograniczyć możliwości typu generycznego:

public abstract class Skill<T extends BaseClass> {
...

Świetna sprawa.

A co jeżeli w niektórych przypadkach potrzeba będzie więcej niż 2 zmiennych?
Przykładowo

public class IceSkill extends Skill {

    public IceSkill(SkillType skillType) {
        super(skillType);
    }

    public void use(User user, Block block, int hardness) {
        //use skill using user, block and hardness variable.
    }

}
0

No to już wtedy definitywnie kilka różnych metod

0
Pinek napisał(a):

No to już wtedy definitywnie kilka różnych metod

Dziękuję serdecznie za pomoc :)

0
Pinek napisał(a):

No to już wtedy definitywnie kilka różnych metod

To jedna z opcji, dlaczego uważasz że definitywna?

Można przecież połączyć block i hardness w jedną klasę, zawierającą zarówno wartość Block, jak i int - czyli używając kompozycji. (Ewentualnie przez dziedziczenie, tj. rozszerzając Block o ten int).

Nie znamy kontekstu, ale jeśli obie te wartości lubią występować razem i nie tylko w tym miejscu, to warto taki krok rozważyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1