| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Проблема с реализацией интерфейса |
| Автор: FrenchCheese 23.11.2010, 21:05 | ||
есть класс вектор и класс отрезок, задающийся точками (а точки задаются как радиус-вектор) и к этому коду надо добавить абстрактный интерфейс абстрактного вектора(как двумерного так и трехмерного), который реализует методы double scalar(AbstractVector v); double len(); Vector multiply(double factor); Vector add(AbstractVector v); Vector sub(AbstractVector v); но всё это дело у меня вообще в голове не укладывается! как это реализовать? |
| Автор: nc30 24.11.2010, 11:55 | ||||||
Гремучая смесь понятий Интерфейс, он и так абстрактен, т. к. не может реализовывать методы. Интерфейс здесь будет, IMHO, "ни к селу, ни к городу", т. к. если вы создадите интерфейс Vector, то вы сможете его "прицепить" к любой сущности и она станет вектором. Допустим, есть у вас класс HeavyTruck. Вы сможете объявить его так
Существует понятие абстрактного класса. В нем часть методов можно объявить абстрактными, а часть - реализовать. Экземпляр наследника абстрактного класса должен либо все родительские абстрактные методы реализовать, либо также быть объявлен абстрактным. Абстрактный класс может быть чисто абстрактным, когда все его методы объявлены абстрактными. Может быть объявлен абстрактным класс не содержащий ни одного абстрактного метода. В любом случае, создать экземпляр абстрактного класса нельзя. Абстрактный класс имеет смысл использовать, например, в случае, если предполагается наличие подклассов с рядом полностью совпадающих полей и методов, а также методов с одинаковой сигнатурой (название метода, типы и порядок следования параметров), но с разной реализацией. Либо у набора сущностей есть полностью одинаковые поля и методы и есть уникальные. Общие поля/методы можно вынести в суперкласс и объявить его абстрактным, если не предполагается создание объектов этого суперкласса. Проще говоря: есть общая болванка из которой можно сделать разные детали. Детали можно использовать как конечный продукт, а болванку - нет. В вашей задаче я пока не вижу необходимости использования абстрактного суперкласса. Основная причина в том, что ваш Vector - это простая, беззатейная сущность, которая содержит три поля координат и определенный набор простейших методов, которые сложно реализовать по-разному в разных подклассах. Повторюсь, если вы объявите Vector абстрактным, то вы не сможете создать объект этого класса, даже если он не будет содержать ни одного абстрактного метода. Проще создать обычный неабстрактный класс Vector, в котором определить полный набор методов и спокойно с ним работать. Но если очень хочется, то вот один из вариантов:
Вся общая функциональность (и поля, естественно) вынесена в абстрактный суперкласс. Можно объявить часть методов абстрактными, но т. к. их реализация тривиальна, то не вижу в этом смысла. Также, повторюсь, как и в использовании здесь абстрактного класса. Пользу использования абстрактных классов/методов лучше рассматривать на более подходящем примере. |
| Автор: FrenchCheese 24.11.2010, 14:53 |
| Спасибо огромное, сейчас все по полочкам улеглось сейчас у меня 2 класса вектор2Д и вектор 3Д наследуются от абстрактного класса а как сделать так чтобы класс Segment работал с классом AbstractVector, тоесть с двумя классами векторов? |
| Автор: nc30 25.11.2010, 07:35 | ||||
В Java переменная типа суперкласса может ссылаться на любые экземпляры дочерних классов. В вашем случае это можно схематично изобразить так:
Здесь не обойтись без понимания таких замечательных штук, как полиморфизм и динамическое (позднее) связывание. Но об этом (а также о многих других интересных вещах в ООП и их реализации в Java) я предлагаю вам узнать самостоятельно |