2016-03-30 11 views
4

Bir matris kitaplığı (eğitim amaçlı) oluşturmaya çalışıyorum ve bir engele ulaştığımdan emin değilim. grace ile nasıl yaklaşacağımı bilmiyorum. İki matris eklemek, her bir matrisin öğesinde ayrı ayrı get() yöntemini kullanarak basit bir görevdir.Soyut sınıf yöntemi - Çocuk sınıfı nesnesini somutlaştırmak için?

Ancak, kullandığım sözdizimi yanlış. NetBeans bir sınıf beklediğini iddia ediyor, ancak bir tür parametresi buldu; bana, bir tip parametresi, yalnızca sınıf kümesine 1: 1 eşlemeli bir kümedir.

Burada neden hatalıyım? Daha önce bir sınıftan başka bir şey türü olan bir parametre görmedim, bu yüzden aşağıdaki biraz M sınıfı bir sınıf olamamalı mı?

M Matrisi

public abstract class Matrix<T extends Number, M extends Matrix> 
{ 
    private int rows, cols; 
    public Matrix(int rows, int cols) 
    { 
     this.rows = rows; 
     this.cols = cols; 
    } 

    public M plus(Matrix other) 
    { 
     // Do some maths using get() on implicit and explicit arguments. 
     // Store result in a new matrix of the same type as the implicit argument, 
     // using set() on a new matrix. 
     M result = new M(2, 2); /* Example */ 
    } 

    public abstract T get(int row, int col); 
    public abstract void set(int row, int col, T val); 
} 
+1

Matrix sınıfında neden kendiliğinden uzanan bir tür var? –

+0

@ cricket_007 Sebeplerim, plus() öğesinin Matrix'i genişleten bir nesneyi döndürmesidir. Şimdi yazdığımda gerçekten aptalca geliyor. Belki dönüş tipi sadece Matrix olmalıdır .. Ama sonra plus() işlevinin içindeki matrisi başlatamıyorum, değil mi? Soyut bir sınıf olarak. –

+2

Tam türünü bilmediğiniz için bir tür parametresini doğrudan kullanamazsınız. – Andrew

cevap

2

Tam türünü bilmediğinizden, bir tür parametre M doğrudan başlatılamıyor.


Ben aşağıdaki yöntemi

public abstract <M extends Matrix> M plus(M other); 

ve alt sınıfta uygulanmasını oluşturma hakkında düşünme öneririz.

0

Ben senin M gereklidir düşünmüyor musunuz uzanır.

Matrix'un bir alt sınıfı ise, tanımınızda yalnızca Matrix kullanın.

public abstract class Matrix<T extends Number> 
{ 
    private int rows, cols; 
    public Matrix(int rows, int cols) 
    { 
     this.rows = rows; 
     this.cols = cols; 
    } 

    public Matrix<T> plus(Matrix<T> other) 
    { 
    } 

    public abstract T get(int row, int col); 
    public abstract void set(int row, int col, T val); 
} 
0

Aşağıdaki kod yanlıştır:

M result = new M(2, 2); 

M sen örneğini bir sınıf değildir.

Temel olarak, veri yapınızı biraz değiştirmelisiniz, çünkü Matrix sınıfınız abstract ve başlatılamıyor!

plus dönüş türünü Matrix olarak değiştirmenizi ve özet bırakmanızı öneririz.

2

Kodunuzdan, bazı alt sınıfı Matrix'ten genişletmek ve bunların üzerinde hesaplama yapmak istediğinizi tahmin ediyorum.

Değişim her çocuk sınıfta

public abstract class Matrix<T extends number> { 
    ... 
    public abstract Matrix plus(Matrix other); 
    ... 
} 

için, artı uygulanmasını ekleyin. Çünkü çocuk sınıfının yapım fonksiyonu orada tanımlanmıştır.