2013-05-15 3 views
0

Я все еще новичок в Java, и есть некоторые концепции, которые меня все еще путают. Я бы хотел запустить вибрацию в классе stummer из моего основного класса. Вибрационный метод не может существовать в моем основном классе, поскольку он является абстрактным методом (я предполагаю). Я хочу вызвать этот метод из моего основного класса, но я не уверен, как с момента получения «статической ссылки на нестатический метод». У меня есть очень общее представление о том, почему это не работает, но мне нужно знать, как вы бы назвали этот метод, полагая, что он не будет работать в методе playTheSound.Как вызвать функцию в абстрактном классе?

Heres код

public void playTheSound() { 
    // set up MediaPlayer 
    MediaPlayer mp = new MediaPlayer(); 
    switch (i) { 
    case 1: 
     mp = MediaPlayer.create(this, R.raw.cmaj); 
     mp.start(); 
     strummer.vibrate(pattern, repeat); 
     break; 
    } 

} 
} 

abstract class strummer { 

public abstract void vibrate (long[] pattern, int repeat); 

} 
+1

Является ли ваш класс методом '' 'playTheSound()' '' наследуемым от класса strummer? –

+0

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

+0

Прежде всего, вам нужно понять концепции абстрактного класса и методов: http://en.wikipedia.org/wiki/Abstract_class В принципе, абстрактный класс является классом, который должен быть расширен другим классом, который затем обеспечит конкретную реализацию абстрактных методов. Ваш код может ссылаться на абстрактный класс, но ему нужно получить ссылку для конкретного класса, который ее расширяет. –

ответ

1

Во-первых, Strummer абстрактный класс, поэтому вы не можете создать его экземпляр непосредственно. Вы должны создать подкласс, например, MyStrummer extends Strummer, который переопределяет любые абстрактные методы в Strummer.

public abstract class Strummer 
{ 
    public abstract void vibrate(long[] pattern, int repeat);//This is only the signature. 
} 

public class MyStrummer extends Strummer 
{ 
    public void playTheSound() { 
     this.vibrate(); 
     //Do your stuff over here 
    } 
    public void vibrate(long[] pattern, int repeat){//Overriding the method 
     //Write vibrate method details here. 
    } 
} 
+1

SubClass должен расширять суперклассы! – Azad

+0

Спасибо .. забудьте добавить код, хотя я написал то же самое .. Edited. –

0

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

public abstract class strummer 
{ 
    public abstract void vibrate(long[] pattern, int repeat); 
} 

public class yourClass extends strummer 
{ 
    public void playTheSound() 
    { 
     this.vibrate(); 
     ... 
    } 


    // The vibrate method MUST be implemented here 
    // since we inherited from an abstract class! 
    public void vibrate(long[] pattern, int repeat) 
    { 
     // write vibrate method here. 
    } 

} 
+1

То же самое, Subclass должен расширять класс супер, вы забыли продлить. – Azad

+0

Спасибо, что поймали мою глупую ошибку! –

0

Stummer ob = new Your_class_Name();

// Your_class_Name = внутри которого ваш метод playTheSound() создается

ob.playTheSound();

0

Вам необходимо как минимум два класса.

// Strummer.java 
abstract class Strummer { 
    public abstract void vibrate (long[] pattern, int repeat); 
    protected long[] pattern; // Not recommended, but this 
    protected int repeat;  // allows the vibrate call to work. 
    public void playTheSound(int i) { 
     MediaPlayer mp = new MediaPlayer(); 
     switch (i) { 
      case 1: 
       mp = MediaPlayer.create(this, R.raw.cmaj); 
       mp.start(); 
       vibrate(pattern, repeat); 
       break; 
      case 2: 
       // stuff 
       break; 
      // more stuff 
     } 
    } 
} 

и (в одном пакете)

//RealStrummer.java 
public class RealStrummer extends Strummer { 
    private int mode; 

    public RealStrummer(int mode, long[] pattern, int repeat) { 
     this.mode = mode; 
     this.pattern = pattern; 
     this.repeat = repeat; 
    } 
    public void vibrate() { 
     // stuff 
    } 
    public void play() { 
     playTheSound(mode); 
    } 
    public static void main(String[] args) { 
     RealStrummer rs = new RealStrummer(1, new long[] {1L, 3L, 2L}, 10); 
     rs.play(); 
    } 
} 

Теперь, вы, вероятно, хотите, чтобы реорганизовать шаблон и повторите переменные экземпляра, чтобы избежать использования protected. Однако обратите внимание, что не абстрактный RealStrummer определяет конкретный метод vibrate (хотя я не знаю, что он должен содержать).
Strummer может вызывать его, даже если он только объявляет его. Поскольку вы не можете создать экземпляр Strummer, все в порядке.

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