Yes, the base should be Area2D (or CollisionObject2D if you plan to have areas and bodies).
Example (may contain syntax errors):
base-enemy.gd
extends Area2D
export(PackedScene) var shot
var speed = 0.0
var mov_direction = 0
func _ready(): #always run this when enter the tree
set_fixed_process(true)
init_vars()
func init_vars(): #dummy
pass
func shot(): #common shot
do_shot_stuff()
sub-enemy.gd
extends "base-enemy.gd"
#there's a implicit call for parent ready on Godot 2.x
func init_vars(): #super ready uses this override
speed = 100
func _fixed_process(delta):
process_stuff()
This is not only useful for this kind of things, I'm experimenting with a FSM where each state is on a different script and switch scripts with a common base for different behavior.