如何查找一个抽象类的所有子类

如何查找一个抽象类的所有子类,第1张

子类B只要实现了抽象类A,就一定要实现抽象类A中的抽象方法。 如果子类B不实现抽象类A中的 抽象 方法,那么除非将子类B也声明为一个抽象类。 但是如果子类B还有子类C,并且这个子类C不是抽象类,就要实现父类B和父类的父类C所有抽象方。

例如,

Sql Server 2000因为你这里说了只有三级分类,所以我就不写Sql函数了,得到华北下面所有子类别的ClassID(不包括华北的ClassID)select ClassID from Newclass where classParentID in (select ClassID from Newclass where classParentID=51)

根据类别ClassID表查询新闻select from News where ClassID in (select ClassID from Newclass where classParentID in (select ClassID from Newclass where classParentID=51))

同学你好,你可以反射+轮寻一遍。

private Type[] GetChildTypes(Type parentType)

{

    List<Type> lstType = new List<Type>();

    Assembly assem = AssemblyGetAssembly(parentType);

    foreach (Type tChild in assemGetTypes())

    {

        if (tChildBaseType == parentType)

        {

            lstTypeAdd(tChild);

        }

    }

    return lstTypeToArray();

}

调用写法:

Type[] tChildTypes = GetChildTypes(typeof(Class1));

备注:

Class1是父类 Class2,Class3是Class1的子类。

返回结果:

Type[0]=Class2

Type[1]=Class3

这是否符合你的要求?

1)父类构造函数

java中当调用某个类的构造方法的时候,系统总会调用父类的非静态初始化块进行初始化,这个调用是隐式的,而且父类的静态初始化代码

块总是会被执行,接着调用父类的一个或者多个构造器执行初始化,这个调用也可以通过super进行显式调用。

例如:

父类代码如下:

public class Creature {//父类

{//非静态代码块

Systemoutprintln("creature的非静态代码块正在执行");

}

public Creature(){

Systemoutprintln("creature的构造函数正在执行");

}

}

子类代码如下:

public class Animal extends Creature {

{

Systemoutprintln("animal的初始化代码块正在执行");

}

public Animal(){

Systemoutprintln("animal的构造方法正在执行");

}

public static void main(String[] args){

Animal a = new Animal() ;

}

}

则运行程序后的结果为:

creature的非静态代码块正在执行

creature的构造函数正在执行

animal的初始化代码块正在执行

animal的构造方法正在执行

从结果中可以看出:调用某个类的构造方法的时候总是会先执行父类的非静态代码块,然后执行父类的构造方法,最后才是执行当前类的。

非静态代码块和构造方法。执行过程中有先后顺序。

若果想要显式调用父类的构造方法则可以使用super(),来调用,但是super关键字和this关键字都必须放在构造放的第一行,而且只能使用第一个。

注:super用于显式调用父类的构造器,this可以显式调用本类中的重载的构造器。

2)访问子类对象的实例变量

子类的方法可以访问父类中的实例变量,这是因为子类继承父类就会获得父类中的成员变量和方法,但是父类方法不能访问子类的实例变量,因为父类根本无法知道它将被哪个类继承,它的子类将会增加怎么样的成员变量。但是,在极端的情况下,父类也可以访问子类中的变量。

例如:

父类代码如下:

public class Base {//父类

private int i = 2 ;

public Base(){

thisdisplay() ;

}

public void display(){

Systemoutprintln(i);

}

}

子类中代码如下:

public class Derived extends Base {

private int i = 22 ;

public Derived(){

i = 222 ;

}

public void display(){

Systemoutprintln(i);

}

}

测试用例如下:

public class Test {

public static void main(String[] args) {

new Derived() ;

}

}

程序的执行结果为:

0

调用new Derived() ;创建Derived

实例的时候,系统会为Derived对象分配内存空间,Derived会有两个i实例变量,会分配两个空间来保存i的值。分配完空间以后i的值为0

,如果有引用类型则引用类型的值为null。接下来程序在执行Derived的构造器之前会执行Base的构造器,表面上看Base的构造器中只有

一行代码,但是在父类中定义i的时候执行的初始值2,因此经过编译之后,该构造方法中应该包含如下两行代码:

i =2 ;

thisdisplay() ;

程序先将Base中的i赋值为2,然后执行display方法。此处有一个关键字this,this到底代表谁呢?表面上看this代表的是Base的当前实例,但是实际上代码是放在Derived的构造器中的,所以this最终代表的是Derived的当前实例(编译类型是Base而实际引用一个Derived对象),所以如果在父类的构造方法中直接输出Systemoutprintln(thisi) ;则输出的结果为2。但是调用thisdisplay()方法,此时调用的是子类中重写的display方法,输出的变量i也是子类中的i,但是此时子类中的变量i还没有赋值,所以输出结果为0。

为了详细的看清楚this变量到底代表什么实例,我们将Base的构造方法修改如下:

public Base(){

Systemoutprintln(thisi);

Systemoutprintln(thisgetClass());

thisdisplay() ;

}

再次运行程序,结果为:

2

class eduqichaochapter2Derived

0

可以看到this代表的是Derived的实例,但是编译的时候类型为Base,所以输出thisi的值为2。

3)调用被子类重写的方法

默认情况下,子类可以调用父类的方法,但是父类不能调用子类的方法,因为父类不知道它将被哪个子类继承,也不知道子类将增加怎么

样的方法。

例如:

父类Animal的代码如下:

public class Animal {

private String desc ;

public Animal(){

thisdesc = getDesc() ;

}

public String getDesc(){

return "Animal" ;

}

public String toString(){

return desc ;

}

}

子类Wolf的代码如下:

public class Wolf extends Animal {

private String name ;

private double weight ;

public Wolf(String name , double weight){

thisname = name ;

thisweight = weight ;

}

public String getDesc(){

return "Wolf[name=" + name + ",weight=" + weight + "]" ;

}

public static void main(String[] args){

Systemoutprintln(new Wolf("灰太狼" , 3));

}

}

程序的运行结果为:

Wolf[name=null,weight=00]

在main方法中通过new Wolf("灰太狼" , 3);来创建一个Wolf的实例,子类会隐式调用父类的构造方法,在父类构造方法中初始化desc变量thisdesc = getDesc() ;此处需要注意this变量,虽然这个this放在Animal的构造放中,但是是在Wolf的构造方法中调用父类的构造方法,所以this编译时类型为Animal,运行时类型为Wolf,此处调用的getDesc方法是子类Wolf的方法,但是子类中的name和weight变量都没有初始化,默认为null和00所以程序的最终结果为:Wolf[name=null,weight=00]

4)继承成员变量和成员方法的区别

java中队成员变量的继承和成员方法的继承是不同的。

例如:

父类代码如下:

public class Base {

int count = 2 ;

public void display(){

Systemoutprintln(thiscount);

}

}

子类代码如下:

public class Derived extends Base {

int count = 20 ;

@Override

public void display(){

Systemoutprintln(thiscount);

}

}

测试用例如下:

public class Test {

public static void main(String[] args) {

Base b = new Base() ;

Systemoutprintln(bcount);

bdisplay() ;

Systemoutprintln("-----------------");

Derived d = new Derived() ;

Systemoutprintln(dcount);

ddisplay() ;

Systemoutprintln("-----------------");

Base bd = new Derived() ;

Systemoutprintln(bdcount);

bddisplay() ;

Systemoutprintln("-----------------");

Base d2b = d ;

Systemoutprintln(d2bcount);

}

}

程序运行结果为:

2

2

-----------------

20

20

-----------------

2

20

-----------------

2

递归获取某一父类的所有子类

all_subclasses = {'0': '0'}

def get_all_classes(model):

    """

    获取父类的所有子类

    """

    for subclass in model__subclasses__():

        # print(subclass_metaabstract)

        if (not (subclass__name__) in all_subclasseskeys()) and (not subclass_metaabstract):

            all_subclasses[subclass__name__] = subclass

        get_all_classes(subclass)

    return all_subclasses

这里主要用到了__subclasses__() 这个方法,这个方法返回的是这个类的子类的集合,用递归的方法,去获取传入类型的所有子类。返回给全局变量 all_subclasses这个字典集合。

以上就是关于如何查找一个抽象类的所有子类全部的内容,包括:如何查找一个抽象类的所有子类、c#如何找到父类的子类、在java 中 父类定义的静态方法 子类 调用时候 如何 知道 是哪个子类调用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10066003.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存