LINUX.ORG.RU

[жабакод]непонятка с классами и конструктором


0

2

Пытаюсь перевести свой старый проект с Lazarus на Java (чтобы изучить последний)

80% перевести удалось очень легко, а вот тут затык.

код на Pascal

type
  TVector = record
  X, Y, Z: single;
  end;
function GetVector(X, Y, Z: single): TVector;
begin
 Result.X := X;
 Result.Y := Y;
 Result.Z := Z;
end;

// Base functions
function AddVector(Vector1, Vector2: TVector): TVector;
begin
 Result.X := Vector1.X + Vector2.X;
 Result.Y := Vector1.Y + Vector2.Y;
 Result.Z := Vector1.Z + Vector2.Z;
end;

переводим на Java

class vector_class {

   class TVector {
       float X, Y, Z;
   }
   public void GetVector(float X, float Y, float Z) {
       this.X = X;
       this.Y = Y;
       this.Z = Z;
   }

   public void AddVector(TVector Vector1, TVector Vector2) {
       this.X = Vector1.X + Vector2.X;
       this.Y = Vector1.Y + Vector2.Y;
       this.Z = Vector1.Z + Vector2.Z;
   }
}
Как правильно будет?

P.S Да, я хочу свой лунный модуль с шахматами и поэтессами.

★★★★★

Последнее исправление: sniper21 (всего исправлений: 2)

Плохо понимаю, что ты хочешь, но вот так можно:

class TVector {
    public TVector (float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
    } 

    public TVector add (TVector vector) {
        return TVector (x + vector.x, y + vector.y, z + vector.z);
    }

    public static TVector add (TVector a, TVector b) {
        return a.add (b);
    }
}
...

TVector cube = TVector.add (TVector (0, 0, 1), TVector (1, 0, 0).add (TVector (0, 1, 0));
note173 ★★★★★
()
Ответ на: комментарий от note173

Поля забыл, в класс нужно дописать private float x, y, z;

note173 ★★★★★
()
Ответ на: комментарий от sniper21

естественно. почитать таки стоит, да.

и лучше все-таки соблюдать принятый в жаве стиль именования

korvin_ ★★★★★
()
Ответ на: комментарий от korvin_

Два месяца пишу на с++, уже привык :) Конечно, надо new.

note173 ★★★★★
()

если почти дословно, но неправильно, то

public class MyVector {

    public float x;
    public float y;
    public float z;

    public MyVector(float x, float y, float z) {

        this.x = x;
        this.y = y;
        this.z = z;
    }
    
    public void add(MyVector v) {
        
        x += v.x;
        y += v.y;
        z += v.z;
    }
}

korvin_ ★★★★★
()
Ответ на: комментарий от note173

я хочу чтобы вызывалось всё также как и было раньше т.е.

myVector := GetVector(i,0, j); myv2 := GetVector(3,4,5);

added := addvector(myVector,myv2);

added.x содержит x компоненту и.т.д

sniper21 ★★★★★
() автор топика
Ответ на: комментарий от sniper21

class MyFramework
{
    public static class TVector
    {
        public float X, Y, Z;
    }

    public static TVector GetVector (float X, float Y, float Z)
    {
        return new TVector (X, Y, Z);
    }

    public static TVector AddVector (TVector Vector1, TVector Vector2)
    {
        TVector Result = new TVector ();
        Result.X = Vector1.X + Vector2.X;
        Result.Y = Vector1.Y + Vector2.Y;
        Result.Z = Vector1.Z + Vector2.Z;
        return Result;
    }
}

Функций в яве нет, только методы, и должны они принадлежать какому-то классу, поэтому код, использующий вышенаписанное, должен располагаться в том же классе MyFramework или в другом, но в виде MyFramework.TVector = MyFramework.GetVector (0, 0, 0);

note173 ★★★★★
()
Ответ на: комментарий от korvin_

Такая аватара - и мутабельные данные. :( Надо же так:

public class MyVector {
    public final float x;
    public final float y;
    public final float z;

    public MyVector(float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    
    public MyVector add(MyVector v) {        
        return new MyVector(x + v.x, y + v.y, z + v.z);
    }
}

pitekantrop ★★★
()

Пытаюсь перевести свой старый проект с Lazarus на Java

Переводи сразу на Scala:

case class Vector3D(x: Double, y: Double, z: Double) {
  def +(v: Vector3D) = Vector3D(x + v.x, y + v.y, z + v.z)
}

object Test extends App {
  val v = Vector3D(0, 1, 2)
  val u = Vector3D(3, 4, 5)
  println(v + u)
}

kamre ★★★
()
Ответ на: комментарий от pitekantrop

Он просил буквальный перевод. Я бы векторы в виде классов вообще не использовал, массивы быстрее.

note173 ★★★★★
()
Ответ на: комментарий от kamre

>Переводи сразу на Scala:

я учу то, за что платят, люблю я всё равно Pascal :)

sniper21 ★★★★★
() автор топика

Нельзя переводить текст^Wкод дословно:
Eng: I name is urxvt.
Ru: Я имя есть urxvt.

urxvt ★★★★★
()
Ответ на: комментарий от note173

> Он просил буквальный перевод.

Разве? По-моему, он спрашивал, как будет правильно.

У него был, по-моему, вполне идиоматичный код на Паскале. Если его переводить на Жабу, то тоже в идиоматичный код. Иначе это не изучение языка, а дрочерство.

Я бы векторы в виде классов вообще не использовал, массивы быстрее.

Для 3-х координат? Не факт. В любом случае, пока профайлинг не покажет, что узкое место именно здесь, жертвовать типобезопасностью ради призрачного выигрыша в скорости не стоит.

pitekantrop ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.