Inheritance 继承:理解

Inheritance 继承:理解,inheritance,Inheritance,例如,假设一个程序处理由实部和虚部组成的复数。在复数中,实部和虚部的行为类似于实数,因此所有运算(+、-、/、*、sqrt、sin、cos等)都可以从称为实数的对象类中继承,而不必用代码编写 子类复合体不需要编写任何代码的断言似乎可信吗 就每个类必须维护的数据成员而言,这有意义吗?为什么 这在方法上有意义吗?有没有更好的方法来使用现有的类Real创建类复合体?Complex实际上并没有扩展Real。实数只是复数的一种特殊情况(其中虚部为0)。如果复数扩展了实数,并且依赖于实数的算术运算,那么它们

例如,假设一个程序处理由实部和虚部组成的复数。在复数中,实部和虚部的行为类似于实数,因此所有运算(+、-、/、*、sqrt、sin、cos等)都可以从称为实数的对象类中继承,而不必用代码编写

子类复合体不需要编写任何代码的断言似乎可信吗

就每个类必须维护的数据成员而言,这有意义吗?为什么


这在方法上有意义吗?有没有更好的方法来使用现有的类Real创建类复合体?

Complex实际上并没有扩展Real。实数只是复数的一种特殊情况(其中虚部为0)。如果复数扩展了实数,并且依赖于实数的算术运算,那么它们将是不正确的。例如,添加操作将添加真实零件并返回真实零件

学习OOP时的一个常见错误是到处都能看到继承关系,而实际上它们远不常见。问题的一部分在于,书籍和糟糕的课程给了你一个可怕的例子,从而使这一点永久化(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);
  }

  ...
}
注意:这演示了两个更有用的学习概念:

  • 不可更改性。一旦创建了复合体,就不能修改它。这是非常有用的
  • 工厂方法。注意构造函数是私有的。这是经过深思熟虑的,允许您控制对象的实例化方式。例如,如果有人调用makeReal(3.0d)两次,您可以让它返回相同的实例,而不是每次都创建一个新实例

  • 复杂并不是真的扩展到真实。实数只是复数的一种特殊情况(其中虚部为0)。如果复数扩展了实数,并且依赖于实数的算术运算,那么它们将是不正确的。例如,添加操作将添加真实零件并返回真实零件

    学习OOP时的一个常见错误是到处都能看到继承关系,而实际上它们远不常见。问题的一部分在于,书籍和糟糕的课程给了你一个可怕的例子,从而使这一点永久化(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);
      }
    
      ...
    }
    
    注意:这演示了两个更有用的学习概念:

  • 不可更改性。一旦创建了复合体,就不能修改它。这是非常有用的
  • 工厂方法。注意构造函数是私有的。这是经过深思熟虑的,允许您控制对象的实例化方式。例如,如果有人调用makeReal(3.0d)两次,您可以让它返回相同的实例,而不是每次都创建一个新实例

  • 我真的不完全理解你的问题。Complex是通过使用一种rational方法实现的数据类型。复数由两个实部构成,第一个是原样,第二个假设为虚部的前置因子。您可以在内部用字符串、位数组或整数实现复数,每个数字一个,但那将是非常愚蠢的


    复杂类确实需要代码。一个复合体不是真实的,它是一个复合体,它的行为方式与真实的不同。你甚至不能创建一个复杂的real子类,它们是两个不同的东西。

    我真的不能完全理解你的问题。Complex是通过使用一种rational方法实现的数据类型。复数由两个实部构成,第一个是原样,第二个假设为虚部的前置因子。您可以在内部用字符串、位数组或整数实现复数,每个数字一个,但那将是非常愚蠢的


    复杂类确实需要代码。一个复合体不是真实的,它是一个复合体,它的行为方式与真实的不同。你甚至不能创建一个复数作为实数的子类,它们是两个不同的东西。

    复数是两个实数的组合,x+i*y,其中i是sqrt(-1)

    您的复杂类需要处理关于如何将两个复数加/减/乘/除等所需的额外逻辑

    例如,(a+ib)*(c+id)=(ac− bd+i(bc+ad)

    这是将放入复杂类中的代码

    但是,它会以另一种方式工作——如果您已经有一个复杂的类,而没有实际的类(无论这种情况多么不可能),那么您可以将实际的类定义为复杂的子类,并将虚拟的组件锁定为0


    从Real继承如此复杂的内容是行不通的。更好的方法不是继承,而是组合——复数由两个实数组成。

    复数是两个实数的组合,x+i*y,其中i是sqrt(-1)

    您的复杂类需要处理关于如何将两个复数加/减/乘/除等所需的额外逻辑

    例如,(a+ib)*(c+id)=(ac− bd+i(bc+ad)

    这是将放入复杂类中的代码

    但是,它会以另一种方式工作——如果您已经有一个复杂的类,而没有实际的类(无论这种情况多么不可能),那么您可以将实际的类定义为复杂的子类,并将虚拟的组件锁定为0


    从Real继承如此复杂的内容是行不通的。更好的方法不是继承,而是组合——一个复数由两个实数组成。

    我完全不理解你的问题。在里面