Наследование: понимание - PullRequest
0 голосов
/ 02 ноября 2009

предположим, например, что программа предназначена для обработки комплексных чисел, состоящих из действительной и мнимой частей. в комплексном числе действительная и мнимая части ведут себя как действительные числа, поэтому все операции (+, -, /, *, sqrt, sin, cos и т. д.) могут наследоваться от класса объектов, называемых REAL, вместо быть написано в коде.

Кажется ли правдоподобным утверждение о том, что дочернему классу Complex не нужно писать какой-либо код?

Имеет ли это смысл с точки зрения членов данных, которые должен поддерживать каждый класс? Почему или почему нет?

Имеет ли это смысл с точки зрения методов? Есть ли лучший подход для создания класса Complex с использованием существующего класса Real?

Ответы [ 4 ]

6 голосов
/ 02 ноября 2009

Комплекс на самом деле не расширяет Реал. Вещественное число - это просто частный случай Complex (мнимая часть равна 0). Если Complex расширяет Real и полагается на арифметические операции Real, то они будут неверными. Например, операция Add добавит действительные части и вернет Real.

Распространенной ошибкой при изучении ООП является повсеместное рассмотрение отношений наследования, хотя на самом деле они гораздо реже. Часть проблемы в том, что книги и плохие классы увековечивают это, давая вам ужасный пример (гораздо больше в 90-х, но это все еще так). Композиция встречается гораздо чаще.

Чтобы дать вам пример Java (поскольку вы не упоминаете язык, а реальный код часто более полезен, чем описания псевдокодов), возможно, более уместно:

public class Complex {
  private final double real;
  private final double imaginary;

  private Complex(double real) {
    this(real, 0.0d);
  }

  private Complex(double real, double imaginary) {
    this.real = real;
    this.imaginary = imaginary;
  }

  public static Complex makeReal(double real) {
    return new Complex(real);
  }

  public static Complex makeComplex(double real, double imaginary) {
    return new Complex(real, imaginary);
  }

  public Complex add(Complex other) {
    return makeComplex(real + other.real, imaginary + other.imaginary);
  }

  ...
}

Примечание: это демонстрирует еще две полезные концепции для изучения:

  1. Неизменность. Вы не можете изменять Комплекс после его создания. Это невероятно полезно;
  2. Методы фабрики. Обратите внимание, что конструкторы являются частными. Это является преднамеренным и позволяет вам контролировать, как создаются объекты. Например, если кто-то дважды вызывает makeReal (3.0d), вы можете заставить его возвращать один и тот же экземпляр, а не каждый раз создавать новый.
0 голосов
/ 02 ноября 2009

Я вообще не понимаю вашего вопроса. В области математики действительные и комплексные числа содержатся друг в друге. Вещественные числа - это комплексные числа с комплексной частью, установленной на 0; в этом смысле комплексное множество является надмножеством действительных чисел; они являются числами, но ни одна из них не обладает общими характеристиками, подтверждающими предположение о том, что один является специализацией / обобщением другого. Теперь в мире распространенных типов данных, таких как C и Java, вы никогда не найдете сложный тип, заданный для примитивного типа (то есть int, char и т. Д.). Затем, если вы хотите расширить набор типов данных для добавления поддержки комплексных чисел, вам нужно будет создать класс Complex с операциями, определенными математиками для комплексных чисел.

0 голосов
/ 02 ноября 2009

Комплексное число представляет собой комбинацию двух действительных чисел, x + i * y, где i - квадрат (-1).

Ваш комплексный класс должен будет обрабатывать дополнительную логику, необходимую для сложения / вычитания / умножения / деления / и т.д. двух комплексных чисел.

Например. (a + i b) * (c + i d) = (ac - bd) + i (bc + ad).

Это код, который будет идти в вашем классе Complex.

Однако все будет работать по-другому - если у вас уже есть класс Complex и нет класса Real (хотя это маловероятно), вы можете определить класс Real как подкласс класса Complex и просто зафиксировать мнимый компонент в 0.

Так что сложное наследование от Real не будет работать. Лучший подход включал бы не наследование, а композицию - комплексное число состоит из , составленного из двух действительных чисел.

0 голосов
/ 02 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...