Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с реализацией интерфейса 
:(
    Опции темы
FrenchCheese
Дата 23.11.2010, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 8.9.2010

Репутация: нет
Всего: нет



Код

import java.io.*;
import java.lang.Math.*;

class Segment extends Vector{
    Vector start;
    Vector end;
    
    double leng(Segment seg) {
        Vector st = seg.getStart();
        Vector en = seg.getEnd();
        Vector tempVector = new Vector();
        double result;
        
        tempVector = st.sub(en);
        result = tempVector.len(tempVector);
        return result;
    }
    double distanceTo (Vector point) { // верен ли алгоритм?
        Vector st = this.getStart();
        Vector en = this.getEnd();
        Vector tempVector = new Vector();
        double result = 1.0;
        double nominator;
        double denominator;
    
        tempVector = st.sub(en);
        nominator = tempVector.scalar(tempVector, point);
        denominator = tempVector.len(tempVector);
        result = nominator/denominator;
        return result;
    }
    Vector getEnd() {
     return this.end;
    }
    Vector getStart() {
     return this.start;
    }

}
class Vector {
    private double x;
    private double y;
    private double z;
    
    Vector(double newx, double newy, double newz) {
        x = newx;
        y = newy;
        z = newz;
    }
    Vector() {
        ;
    }
    public double getX() {
        return this.x;
    }
    public double getY() {
        return this.y;
    }
    public double getZ() {
        return this.z;
    }
    public void setX(double x) {
        this.x = x;
    }
    public void setY(double y) {
        this.y = y;
    }
    public void setZ(double z) {
        this.z = z;
    }
    public double len(Vector v){ // работает
        return Math.sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
        
    }
    public Vector add(Vector v) { // работает
     Vector result = new Vector();
     result.x = this.x + v.x;
     result.y = this.y + v.y;
     result.z = this.z + v.z;
     return result;
    }
    public Vector sub(Vector v) { // работает
     Vector result = new Vector();
     result.x = this.x - v.x;
     result.y = this.y - v.y;
     result.z = this.z - v.z;
     return result;
    }
    public Vector multiply(double factor) { // работает
     Vector result = new Vector();
     result.x = this.x * factor;
     result.y = this.y * factor;
     result.z = this.z * factor;
     return result;
    }
    public static double scalar(Vector v) { // работает
     return (v.x*v.x + v.y*v.y + v.z*v.z);
    }
    public double scalar(Vector v1, Vector v2) { 
     return (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);
    }
}

class Main {
    public static void main(String[] args) {
     Vector vec1 = new Vector(3,3,3);
     Vector vec2 = new Vector(1,5,1);
     //Vector vec = new Vector();
     //vec = vec2.multiply(2);
     Segment seg = new Segment();
     seg.start = vec1;
     seg.end = vec2;
     double xaxa = vec1.scalar(vec1, vec2);
     double xax = seg.distanceTo(vec2);
     double xa = seg.leng(seg);
     
     
        System.out.println(xax);
    }
}





есть класс вектор и класс отрезок, задающийся точками (а точки задаются как радиус-вектор)
и к этому коду надо добавить абстрактный интерфейс абстрактного вектора(как двумерного так и трехмерного), который реализует методы 
   double scalar(AbstractVector v);
   double len();
   Vector multiply(double factor);
   Vector add(AbstractVector v);
   Vector sub(AbstractVector v);

но всё это дело у меня вообще в голове не укладывается!
как это реализовать?
PM MAIL   Вверх
nc30
Дата 24.11.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 24.6.2010
Где: Санкт-Петербург

Репутация: 5
Всего: 8



Цитата

абстрактный интерфейс абстрактного вектора ..., который реализует методы

Гремучая смесь понятий  smile 
Интерфейс, он и так абстрактен, т. к. не может реализовывать методы. Интерфейс здесь будет, IMHO, "ни к селу, ни к городу", т. к. если вы создадите интерфейс Vector, то вы сможете его "прицепить" к любой сущности и она станет вектором. Допустим, есть у вас класс HeavyTruck. Вы сможете объявить его так
Код

class HeavyTruck implements Vector
 и ваш тяжелый тяжелый грузовик станет также и вектором. Ерунда получится. Подробнее про интерфейсы - к Хорстманну.

Существует понятие абстрактного класса. В нем часть методов можно объявить абстрактными, а часть - реализовать. Экземпляр наследника абстрактного класса должен либо все родительские абстрактные методы реализовать, либо также быть объявлен абстрактным. Абстрактный класс может быть чисто абстрактным, когда все его методы объявлены абстрактными. Может быть объявлен абстрактным класс не содержащий ни одного абстрактного метода. В любом случае, создать экземпляр абстрактного класса нельзя.

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

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

В вашей задаче я пока не вижу необходимости использования абстрактного суперкласса. Основная причина в том, что ваш Vector - это простая, беззатейная сущность, которая содержит три поля координат и определенный набор простейших методов, которые сложно реализовать по-разному в разных подклассах.

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

Но если очень хочется, то вот один из вариантов:
Код

abstract class AbstractVector {
    protected double x;
    protected double y;
    protected double z;
    
    public double getX() {
        return this.x;
    }
    
    public double getY() {
        return this.y;
    }
    
    public double getZ() {
        return this.z;
    }
    
    public void setX(double x) {
        this.x = x;
    }
    
    public void setY(double y) {
        this.y = y;
    }
    
    public void setZ(double z) {
        this.z = z;
    }

    public double len(AbstractVector v) {
//        return Math.sqrt(v.x*v.x + v.y*v.y + v.z*v.z); // длина вектора v
        return Math.sqrt(Math.pow(x - v.x, 2)
                       + Math.pow(y - v.y, 2)
                       + Math.pow(z - v.z, 2));
    }

    // Длина вектора относительно начала координат
    public double len(){
        return Math.sqrt(x*x + y*y + z*z);

    }
    
    public Vector add(AbstractVector v) {
        Vector result = new Vector();
        result.x = this.x + v.x;
        result.y = this.y + v.y;
        result.z = this.z + v.z;
        return result;
    }

    public Vector sub(AbstractVector v) {
        Vector result = new Vector();
        result.x = this.x - v.x;
        result.y = this.y - v.y;
        result.z = this.z - v.z;
        return result;
    }

    public Vector multiply(double factor) {
        Vector result = new Vector();
        result.x = this.x * factor;
        result.y = this.y * factor;
        result.z = this.z * factor;
        return result;
    }
    
    public double scalar(AbstractVector v) {
//        return (v.x*v.x + v.y*v.y + v.z*v.z); // ??? произведение вектора v на себя
        return (this.x * v.x + this.y * v.y + this.z * v.z);
    }
}

//... 

class Vector extends AbstractVector {
    Vector(double newx, double newy, double newz) {
        x = newx;
        y = newy;
        z = newz;
    }
    
    Vector() {
    }
    
    // Это функциональность более высокого уровня представления данных.
    // Vector не должен "предоставлять услуги" по обработке посторонних
    // объектов, если в вычислениях не задействованы его поля.
    public double scalar(Vector v1, Vector v2) {
        return (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);
    }
}

Вся общая функциональность (и поля, естественно) вынесена в абстрактный суперкласс. Можно объявить часть методов абстрактными, но т. к. их реализация тривиальна, то не вижу в этом смысла. Также, повторюсь, как и в использовании здесь абстрактного класса. Пользу использования абстрактных классов/методов лучше рассматривать на более подходящем примере.
PM MAIL   Вверх
FrenchCheese
Дата 24.11.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 8.9.2010

Репутация: нет
Всего: нет



Спасибо огромное, сейчас все по полочкам улеглось
сейчас у меня 2 класса вектор2Д и вектор 3Д наследуются от абстрактного класса
а как сделать так чтобы класс Segment работал с классом AbstractVector, тоесть с двумя классами векторов?
PM MAIL   Вверх
nc30
Дата 25.11.2010, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 24.6.2010
Где: Санкт-Петербург

Репутация: 5
Всего: 8



Цитата

вектор2Д и вектор 3Д наследуются от абстрактного класса
а как сделать так чтобы класс Segment работал с классом AbstractVector, тоесть с двумя классами векторов? 

В Java переменная типа суперкласса может ссылаться на любые экземпляры дочерних классов. В вашем случае это можно схематично изобразить так:
Код

abstract class AbstractVector {
    //...
}

class Vector2D extends AbstractVector {
    //...
}

class Vector3D extends AbstractVector {
    //...
}

class Segment {

    private AbstractVector vector;

    public void someMethod() {

        vector = new Vector2D();
        //...

        vector = new Vector3D();
        //...
    }
}

Здесь не обойтись без понимания таких замечательных штук, как полиморфизм и динамическое (позднее) связывание. Но об этом (а также о многих других интересных вещах в ООП и их реализации в Java) я предлагаю вам узнать самостоятельно  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.