2015-11-20 2 views
0

У меня есть некоторые проблемы с использованием ключевого слова this. Если у меня есть пара классов, реализующих другой класс, как я могу использовать их значения, не вызывая сам класс? Я объясняю.android accessing object внутри расширенный класс

//this is my first class 
public class Foo extends FooHelper{ 
    public int fooInt; 
    public String fooString; 
    //getter/setter below 
} 

//this is my second class 
public class Foo2 extends FooHelper{ 
    public double fooDouble; 
    public float fooFloat; 
} 

//this is my main method, i'm using it for calling the value. 
//I omit all the thrash code before. 
//This is how i want to call the method: 
//imagine before there are onCreate, activity,... 
Foo foo = new Foo().GetFooInt(); 

//this is the class extended from the firsts 
public class FooHelper{ 
    public void GetFooInt(){ 
     //here is my problem, i need to call the Foo class and the fooInt value. 
     //I want also to be able to edit the Foo object, for example: 
     if(((Foo)this).getFooInt() == 0){ 
      (Foo) this.setFooInt(5); 
     } 
    } 
} 

Это то, что я хочу достичь, Acces класса, который расширяет другой класс с единственным this ключевым словом из расширенного класса. Как мне это сделать?

EDIT:

я плохо объяснил, я думаю. Моя проблема в том, что я хочу получить доступ к моему объекту Foo внутри FooHelper, а не к методу FooHelper внутри объекта Foo.

Пример:

после того, как с помощью этого кода:

Foo foo = new Foo(); 
foo.HelperClassMethod(); 

мне нужно (в вспомогательный класс), чтобы получить доступ к объекту Foo, который вызывается его.

public HelperClass<Foo> { 
    public void HelperClassMethod(){ 
     //HERE i need to use the "foo" object which invoked this method 
    } 
} 

Я добавил <Foo>, наверное, мне не хватает его, это правильно? и как я могу использовать этот объект foo в методе из вспомогательного класса? спасибо всем

EDIT2: я полностью провалились на мой вопрос, я thinkm позволяет игнорировать этот код, и просто проверить ниже:

У меня есть доступ к объекту внутри метода расширенного класса.

У меня есть этот класс:

public class Foo extends FooToExtend{ 
    public int fooInt; 
} 

класс, который распространяется на это:

public class FooToExtend{ 
    public void MethodOne(){ 
     //HERE i need to access the calling object 
    } 
} 

сейчас, в моей основной деятельности, я хочу сделать это:

Foo foo = new Foo(); 
foo.MethodOne(); 

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

Я должен изменить свою FooToExtend в

public class<Foo> FooToExtend{ 
    ... 
} 

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

+0

Helper может использоваться как статика .. возможно это будет делать лучшую работу для вас? –

+0

'((Foo) this) .getFooInt() == null' это не сработает, вы не можете компарить' int' и 'null'. – Ramanlfc

+0

Я, честно говоря, не знаю об этом, потому что я не эксперт в этом/супер, новичок, но который является лучшим способом доступа к классу, называемому им из Foo.extendedClassMethod? моя проблема в том, что с тех пор я должен был пройти мой вспомогательный класс, класс, с которым я хотел работать (например, представьте, что мне пришлось делать Foo.GetFooInt (Foo.class). Я хочу, чтобы этот Foo.class не передавал его как переменная –

ответ

2

Я вижу 2 проблемы здесь, понимание this ключевого слова, и extending clases

ПРОБЛЕМА С this KEYWORD

Представьте у вас есть класс, и вы выполняете код: ключевое слово this относится к сам класс, если вы, где объект this будет эквивалентом me. Проверьте here и here более подробные объяснения, примеры и руководства.

ПРОБЛЕМЫ С extend

Также необходимо расширить сверху (интерфейсы или абстрактные классы) до нижней (расширенный) классы и реализуют в нижней части:

//this is the PARENT (FIRST) class extended from the CHILDREN (SECOND) 
public abstract class FooHelper{ 
    public abstract void GetFooInt(); 
} 

//this is the CHILD (SECOND!!!) class 
public class Foo extends FooHelper{ 
    public int fooInt; 
    public String fooString; 

    @Override 
    public void GetFooInt() { 
     // are you sure you getFooInt method can return a null??? 
     if(this.getFooInt() == null){ 
      this.setFooInt(5); 
    } 

    //getter/setter below 
} 

EDIT 1

О, это было полезно. еще один вопрос, способ использовать абстрактный, как вы сказали, но есть ли способ сделать то же самое, не выполняя его все время? просто для информации, моя цель - использовать Foo.FooHelperMethod() и иметь возможность в FooHelperMethod() для доступа к классу Foo. Надеюсь, я объяснил это, я не знаю, как это сделать. Если это невозможно, я буду использовать абстрактные, как вам было предложено :)

Несомненно, это наследование, просто не объявляйте абстрактного родителя, и реализуйте методы И атрибуты там, все дети будут иметь эти методы и атрибуты, расширяя родительский класс.

Давайте посмотрим следующий пример:

//this is the PARENT (FIRST) class extended from the CHILDREN (SECOND) 
class FooHelper { 
    int theIntCommonValue; 

    public int getTheIntCommonValue() { 
     return theIntCommonValue; 
    } 

    public void setTheIntCommonValue(int theIntCommonValue) { 
     this.theIntCommonValue = theIntCommonValue; 
    } 
} 

// CHILDREN CLASS, look how calling this.getTheIntCommonValue() (the parent method) 
// doesn't throw any error because is taking parent method implementation 
class Foo extends FooHelper { 
    public void getFooInt() { 
     if (this.getTheIntCommonValue() == 0) 
      this.setTheIntCommonValue(5); 
    } 
} 
class Foo2 extends FooHelper { 
    public void getFooInt() { 
     if (this.getTheIntCommonValue() == 3) 
      this.setTheIntCommonValue(8); 
    } 
} 

EDIT2:

Мои сомнения в том, как я могу получить доступ к Foo объект, который я создал в основной внутри моей метадона.

ОТВЕТ:

Передача объекта в качестве параметра. Но тогда, вам нужно статический класс, а не расширенный раздел, позволяет увидеть

Пример:

Foo.java

public class Foo { 
    public int fooInt; 
} 

FooHelper.java

public static class FooHelper { 
    public static void methodOne(Foo foo){ 
     //HERE i need to access the calling object 

     // for example, this? 
     if (foo.fooInt == 2) 
    } 
} 

Теперь, как вы его выполняете?

Main.java

public static void main(String[] args) throws Exception { 
    Foo foo = new Foo(); 
    FooHelper.methodOne(foo); 
} 

ПРИМЕЧАНИЯ

  • конвенции говорят, методы запуска Java в LOWECASE и имя класса начинается в UPPERCASE.
  • вы должны поместить оба класса в sepparated файлов для того, чтобы позволить static public class
+0

О, хорошо, это было полезно. Еще один вопрос: способ использовать абстрактный, как вы сказали, но есть способ сделать то же самое, не выполняя его все время? Просто для информации, моя цель - использовать Foo.FooHelperMethod() и иметь возможность в FooHelperMethod() для доступа к классу Foo. Надеюсь, я объяснил это, я знаю, как это сделать .. если это невозможно, я буду использовать абстрактные, как вы предложили :) –

+0

@PierGiorgioMisley проверить мое обновление и не стесняйтесь спрашивать больше, если необходимо –

+0

Извините, но мой английский не очень хорош, и у меня есть некоторые проблемы, объясняющие мою цель. Вы действительно помогаете. Я попытался отредактировать свой ответ для лучшего понимания. Может быть, теперь лучше, спасибо за помощь, если я не понял, скажите мне :) –

0

Я не уверен, что полностью понимаю. Но похоже, что вы хотите, чтобы GetFooInt выполнял что-то по-разному в зависимости от класса, который его расширил. Поэтому я считаю, что лучше всего проверить instanceof.

public class FooHelper{ 
    public void GetFooInt(){ 
     if(this instanceof Foo) 
     { 
      ((Foo) this).fooInt = 5; 
     } 
    } 
} 
0

По ситуации вы хотите по имени одного класса «Helper» Я предполагаю, что вы будете использовать его в качестве хелперов класса.

public class Helper { 
    public static int screenHeight = 500; 
} 

public class AnyOtherClass { 
    testSomething() { 
    System.out.println(Helper.screenHeight); 
    Helper.screenHeight = 510; 
    System.out.println(Helper.screenHeight); 
} 
} 
+0

Я, вероятно, выбрал неправильное имя, я хотел использовать его с ключевым словом extends, а не только как extern-класс –

0

Для некоторого базового понимания: this это ключевое слово используется в нестатической контексте для доступа к переменным и методам объекта, который вы» в настоящее время внутри. Правильное использование this Например:

public class SomeClass { 
    private int someInt; 

    public void setSomeInt(int someInt) { 
     this.someInt = someInt; 
    } 
} 

В этом примере this необходимо, так как локальная переменная (/ параметр) someInt имеет такое же имя в качестве глобального класса переменной someInt. С помощью вы получаете доступ к классу varaible объекта Object, в котором вы находитесь.


Пример ненужного использования этого:

public class SomeClass { 
    private int someInt; 

    public int squareSomeInt() { 
     return this.someInt * this.someInt; 
    } 
} 

Здесь вам не нужно ключевое слово this, так как нет локальной переменной называется someInt.


С другой стороны super это ключевое слово, которое имеет доступ к переменным и методам родительского класса (класс, ваш класс из которой можно вывести). Пример:

public class SomeClass { 
    private int someInt; 
    public int squareSomeInt() { 
     return someInt * someInt; 
    } 
} 

derrived класс:

public class Other extends SomeClass { 
    public int squarePlusSquare() { 
     return super.squareSomeInt() + super.squareSomeInt(); 
    } 
} 
+0

Спасибо за эту информацию, я их не хватал. Но я до сих пор не понимаю, как добиться того, что мне нужно: я должен использовать прямо противоположное ключевому слову «супер». Моя цель - использовать в методе «SomeClass» класс «Другой», вызвав SomeClass с помощью new Other(). SquareSomeInt(); –

+0

SomeClass ничего не знает о классе Other. Другое извращено из SomeClass ... Если у вас нет переменной типа Other в SomeClass, вы не можете вызвать эти методы! – ParkerHalo

+0

попробуйте проверить мое обновление, возможно, я отсутствовал ключ внутри другого класса? –

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

  • Нет связанных вопросов^_^