标签: inheritance

我车库里真的有车吗?

我是Java编程的新手,试图掌握OOP.

所以我构建了这个抽象类:

public abstract class Vehicle{....}
Run Code Online (Sandbox Code Playgroud)

和2个子类:

public class Car extends Vehicle{....}
public class Boat extends Vehicle{....}
Run Code Online (Sandbox Code Playgroud)

Car并且Boat还包含一些不常见的唯一字段和方法(不具有相同的名称,因此我无法在Vehicle中为它们定义抽象方法).

现在在mainClass我设置了我的新车库:

Vehicle[] myGarage= new Vehicle[10];
myGarage[0]=new Car(2,true);
myGarage[1]=new Boat(4,600);
Run Code Online (Sandbox Code Playgroud)

在我尝试访问Car独有的一个字段之前,我对多态性非常满意,例如:

boolean carIsAutomatic = myGarage[0].auto;
Run Code Online (Sandbox Code Playgroud)

编译器不接受.我使用cast来解决这个问题:

boolean carIsAutomatic = ((Car)myGarage[0]).auto;
Run Code Online (Sandbox Code Playgroud)

这有效......但它对方法没有帮助,只是字段.意思是我做不到

(Car)myGarage[0].doSomeCarStuff();
Run Code Online (Sandbox Code Playgroud)

所以我的问题是 - 我的车库里到底有什么?我试图获得直觉以及了解"幕后"发生了什么.


为了将来的读者,请简要总结以下答案:

  1. 是的,有一个CarmyGarage[]
  2. 作为一种静态类型语言,如果通过基于Vehicle超类的数据结构访问那些方法/字段,Java编译器将不会访问非"Vehicle"的方法/字段(例如Vehicle myGarage[])
  3. 至于如何解决,有以下两种主要方法:
    1. 使用类型转换,这将减轻编译器的顾虑,并将设计中的任何错误留给运行时
    2. 我需要铸造的事实说设计是有缺陷的.如果我需要访问非车辆功能,那么我不应该将汽车和船只存储在基于车辆的数据结构中.要么使所有这些功能属于Vehicle,要么使用更具体(派生)类型的结构
  4. 在许多情况下,组合和/或接口将是继承的更好替代方案.可能是我下一个问题的主题......
  5. 如果有人有时间浏览答案,那么还有许多其他好的见解.

java inheritance

259
推荐指数
10
解决办法
3万
查看次数

Javascript是基于原型的语言是什么意思?

据说Javascript的一个主要优点是它是一种基于原型的语言.

但是,Javascript基于原型是什么意思,为什么这是一个优势呢?

javascript oop inheritance prototype-programming

247
推荐指数
7
解决办法
5万
查看次数

子类是否继承私有字段?

这是一个面试问题.

子类是否继承私有字段?

我回答"否",因为我们无法使用"正常的OOP方式"访问它们.但是访谈者认为它们是继承的,因为我们可以间接访问这些字段或使用反射,它们仍然存在于对象中.

我回来后,在javadoc中找到以下引用:

超级私人会员

子类不继承其父类的私有成员.

你知道面试官的意见吗?

java oop inheritance private

233
推荐指数
8
解决办法
21万
查看次数

为什么不能在Java中扩展注释?

我不明白为什么Java注释中没有继承,就像Java类一样.我认为这将非常有用.

例如:我想知道给定的注释是否是验证器.通过继承,我可以反复地浏览超类,以了解此注释是否扩展了ValidatorAnnotation.否则,我该怎样才能做到这一点?

那么,任何人都可以给我这个设计决定的理由吗?

java inheritance annotations

223
推荐指数
4
解决办法
9万
查看次数

在Java中显式调用默认方法

Java 8引入了默认方法,以提供扩展接口的能力,而无需修改现有实现.

我想知道,当该方法被覆盖或由于不同接口中的冲突默认实现不可用时,是否可以显式调用方法的默认实现.

interface A {
    default void foo() {
        System.out.println("A.foo");
    }
}

class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }
    public void afoo() {
        // how to invoke A.foo() here?
    }
}
Run Code Online (Sandbox Code Playgroud)

考虑到上面的代码,你会如何A.foo()从B类方法调用?

java inheritance interface java-8 default-method

217
推荐指数
4
解决办法
5万
查看次数

为什么我不能继承静态类?

我有几个不需要任何州的课程.从组织的角度来看,我想把它们放到层次结构中.

但似乎我无法为静态类声明继承.

像这样的东西:

public static class Base
{
}

public static class Inherited : Base
{
}
Run Code Online (Sandbox Code Playgroud)

不管用.

为什么语言的设计者会关闭这种可能性?

c# inheritance static

216
推荐指数
3
解决办法
14万
查看次数

Python中的抽象方法

我在使用Python继承时遇到了麻烦.虽然这个概念在Java中对我来说似乎太容易了但到目前为止我一直无法理解Python,至少对我来说这是令人惊讶的.

我有一个原型如下:

class Shape():
   def __init__(self, shape_name):
       self.shape = shape_name

class Rectangle(Shape):
   def __init__(self, name):
       self.shape = name
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我如何制作一个需要为所有子类实现的抽象方法?

python inheritance abstract

212
推荐指数
6
解决办法
19万
查看次数

'override'关键字只是检查重写的虚方法吗?

据我所知,override在C++ 11中引入关键字只不过是一个检查,以确保正在实现overridevirtual函数是基类中的函数.

是吗?

c++ inheritance overriding virtual-functions c++11

210
推荐指数
4
解决办法
4万
查看次数

如何在数据库中表示继承?

我正在考虑如何在SQL Server数据库中表示复杂的结构.

考虑一个需要存储一系列对象细节的应用程序,这些对象共享一些属性,但有许多其他属性不常见.例如,商业保险计划可能包括同一保单内的责任,汽车,财产和赔偿保险.

在C#等中实现它是微不足道的,因为您可以创建一个带有Sections集合的Policy,其中Section是根据各种类型的封面所需继承的.但是,关系数据库似乎不容易这样做.

我可以看到有两个主要选择:

  1. 为所有可能的变体创建一个Policy表,然后是一个Sections表,其中包含所需的所有字段,其中大部分都是null.

  2. 创建一个Policy表和许多Section表,每个表对应一种封面.

这两种替代方案似乎都不令人满意,特别是因为必须在所有Sections中编写查询,这将涉及大量连接或大量空检查.

这种情况的最佳做法是什么?

sql database inheritance database-design class-table-inheritance

209
推荐指数
5
解决办法
9万
查看次数

如何"完美"覆盖一个字典?

我怎样才能使"完美"成为dict的子类?最终目标是有一个简单的字典,其中键是小写的.

似乎应该有一些微小的原语我可以覆盖以使这项工作,但根据我的所有研究和尝试似乎情况并非如此:

这是我的第一次尝试,get()不起作用,毫无疑问还有许多其他小问题:

class arbitrary_dict(dict):
    """A dictionary that applies an arbitrary key-altering function
       before accessing the keys."""

    def __keytransform__(self, key):
        return key

    # Overridden methods. List from 
    # https://stackoverflow.com/questions/2390827/how-to-properly-subclass-dict

    def __init__(self, *args, **kwargs):
        self.update(*args, **kwargs)

    # Note: I'm using dict directly, since super(dict, self) doesn't work. …
Run Code Online (Sandbox Code Playgroud)

python inheritance dictionary get set

204
推荐指数
5
解决办法
10万
查看次数