首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在swift中重写私有方法和调用超级方法?

在Swift中,无法直接重写私有方法或调用超级方法。私有方法是指只能在定义它们的类或结构体内部访问的方法,而超级方法是指在子类中重写父类方法后,仍然可以通过super关键字调用父类方法。

在Swift中,可以通过以下方式来模拟重写私有方法和调用超级方法:

  1. 重写私有方法:
    • 将私有方法改为受保护的(internal)或公开的(public)方法,以便在子类中进行重写。
    • 在父类中定义一个受保护的(internal)或公开的(public)方法,作为重写私有方法的入口点。
    • 在子类中重写该受保护的(internal)或公开的(public)方法,实现自定义的逻辑。

例如,假设有一个父类ParentClass,其中定义了一个私有方法privateMethod()。要在子类ChildClass中重写该私有方法,可以按照以下步骤进行:

代码语言:swift
复制

class ParentClass {

代码语言:txt
复制
   fileprivate func privateMethod() {
代码语言:txt
复制
       // 私有方法的实现
代码语言:txt
复制
   }
代码语言:txt
复制
   func publicMethod() {
代码语言:txt
复制
       // 公开方法作为私有方法的入口点
代码语言:txt
复制
       privateMethod()
代码语言:txt
复制
   }

}

class ChildClass: ParentClass {

代码语言:txt
复制
   override func publicMethod() {
代码语言:txt
复制
       // 在子类中重写公开方法,实现自定义逻辑
代码语言:txt
复制
       // 调用super.publicMethod()会间接调用父类的privateMethod()
代码语言:txt
复制
       super.publicMethod()
代码语言:txt
复制
       // 子类自定义的逻辑
代码语言:txt
复制
   }

}

代码语言:txt
复制

在上述示例中,私有方法privateMethod()被改为受保护的方法,并在父类中定义了一个公开方法publicMethod()作为私有方法的入口点。子类ChildClass通过重写公开方法来实现自定义逻辑,并通过super.publicMethod()调用父类的私有方法。

  1. 调用超级方法:
    • 在子类中重写父类方法,并使用super关键字作为前缀来调用父类的实现。

例如,假设有一个父类ParentClass,其中定义了一个方法func someMethod()。要在子类ChildClass中调用父类的实现,可以按照以下步骤进行:

代码语言:swift
复制

class ParentClass {

代码语言:txt
复制
   func someMethod() {
代码语言:txt
复制
       // 父类方法的实现
代码语言:txt
复制
   }

}

class ChildClass: ParentClass {

代码语言:txt
复制
   override func someMethod() {
代码语言:txt
复制
       // 在子类中重写父类方法
代码语言:txt
复制
       super.someMethod() // 调用父类的实现
代码语言:txt
复制
       // 子类自定义的逻辑
代码语言:txt
复制
   }

}

代码语言:txt
复制

在上述示例中,子类ChildClass通过重写父类方法someMethod()来实现自定义逻辑,并通过super.someMethod()调用父类的实现。

需要注意的是,私有方法只能在定义它们的类或结构体内部访问,无法被子类重写或调用。因此,重写私有方法需要将其改为受保护的(internal)或公开的(public)方法。调用超级方法则是通过重写父类方法并使用super关键字来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java 反射机制详解:私有方法调用头大?如何通过反射调用私有方法

文章目录 前言 一、私有方法在本类中直接调用 1.1、在本类实例化,调用私有方法 1.2、尝试在其他类直接调用私有方法(错误示范) 二、使用反射实例化类强制调用私有方法 2.1、使用类加载器加载被调用的类...、运行结果 总结 前言 在 Java 如果我们使用 new 关键字调用构造函数对类进行实例化,我们就可以根据在这个类的修饰符来访问类定义的非私有方法。...一、私有方法在本类中直接调用 1.1、在本类实例化,调用私有方法 说明:被 private 关键字修饰的构造方法方法或者数据域只在其所在的类可见。...(); } } 1.2、尝试在其他类直接调用私有方法(错误示范) 如果我们直接在其他的类实例化 Demo 类,来直接调用 demo() 方法,就会发现 IDE 直接产生编译错误,很明显我们直接在另一个类调用私有方法是行不通的...通常只有实体类(Entity)的成员变量使用 private 修饰,并且会提供访问这些变量的 get set 方法

2.4K21
  • Java方法重载重写(覆盖)

    方法重载(overload)  /*  * 方法重载的判定:同一类方法名相同,参数列表不同(参数个数不同,参数列表对应位置参数类型不同),其他方法返回值  * 访问修饰符都随意。  ...,因为参数ab的类型相同,不管是否进行了参数顺序的改变,最后在方法记录的过程,     // 还是会记录成上面报错信息提示的那样,而这个参数列表与第一个函数的参数列表一模一样。    ...// 从这里也可以看出在方法重载的判定,是不考虑参数名称的。     public void testFunc(int a, float b, int c){} }    二....方法重写(覆盖)  方法重写也叫方法覆盖,表示子类要对父类的某一方法进行修改,方法重写比较简单,通常遵循以下原则:  1. 两同:方法方法参数列表相同  2....一大: 子类重写方法的访问权限大于等于父类方法  3. 二小:子类重写方法抛出的异常类型要小于等于父类;子类重写方法的返回值类型小于等于父类

    2.2K20

    Python类私有属性私有方法

    这时,我们可以设置一对包含getset的方法来给外部调用。...在上面的类,ask_question()方法是普通的方法,在类的外部可以直接调用,__talk_wage()方法私有方法,只能在类的内部使用,如果在外部写调用的代码则报错。...要在外部调用__talk_wage(),只能间接的通过普通方法talk_wage()来调用。 ? 三、私有方法的作用说明 1.私有属性私有方法只能在类内部使用。...虽然私有属性私有方法不能直接从外部访问修改,但是通过间接的方法,我们还是获取到了,也修改了。 这说明,在Python类,没有真正的私有属性私有方法。...make money 在父类定义的普通属性普通方法,子类都继承了,子类可以直接使用,但是父类私有属性私有方法子类无法直接使用,因为子类不会继承父类的私有属性私有方法

    2.9K30

    Swift 的抽象类型方法

    例如,假设我们想统一我们通过网络加载某些类型的模型的方式,通过提供一个共享的API,我们将能够用来分离关注点,使依赖注入模拟变得容易,并在我们的项目中保持方法名称的一致性。...所以,一般来说,协议肯定是在Swift声明抽象类型的首选方式,但这并不意味着它们是完美的。...由于Swift的组合运算符&支持将一个类一个协议结合起来,我们可以将我们的Loadable类型作为LoadableBaseLoadableProtocol之间的组合重新引入: typealias Loadable...中使用抽象类型方法的几种不同方式。...子类化目前可能不像以前那样流行(在其他编程语言中也是如此),但我仍然认为这些技术在我们整个Swift开发工具箱是非常好的。

    80920

    如何访问及调用私有成员及方法

    ---- 本文为原创文章、源代码为原创代码,转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!...二、新建一个Person类,并在类里面添加两个成员,一个是name字段,另外一个是Display方法,该方法带有一个“前缀”输入参数prefix,用于加在name字段前面,如下代码所示: class...: fInfo.SetValue(person,"CNXY"); 3)访问name字段,访问方法如下代码所示: var name = fInfo.GetValue(person); 4)name字段结果如下...说明: BindingFlags.NonPublic:搜索非公有方法的成员; BindingFlags.Instance:搜索成员实例,包括字段及方法等。 五、如何访问Display私有方法?...说明: Invoke用于调用方法,后面的参数使用数组的方法,如有一个参数,则输入一个参数的object数组,如有多个参数,则输入多个参数的object数组。

    2.7K20

    关于使用MethodHandle在子类调用祖父类重写方法的探究

    关于使用MethodHandle在子类调用祖父类重写方法的探究 注:这个例子原本出现在周志明先生的《深入理解Java虚拟机》--虚拟机字节码执行引擎章节,介于有读者朋友有疑问,这里基于Java代码层面解释一下...在普通的方法调用,这个this参数是虚拟机自动处理的,表示的是当前实例对象,我们在方法可以直接使用。...但是在我们这个MethodHandle的例子,相当于是模拟了invoke*指令的处理,手动调用invoke方法就需要指定这个"this"参数。...关于bindTo方法,其实就是指定方法的接收者,bindTo(this).invoke()invoke(this)可以认为是一个意思。...基于这个事实,我们这时可以直接在GrandFather的thinking方法调用Son类独有的方法,使用反射或者直接类型强制转换为Son就行了。

    9.5K30

    Python类公开方法私有方法特殊方法的继承原理

    在Python,对象的私有成员在类外部、派生类或程序无法直接访问,但是可以通过“对象名._类名__私有成员名”这样一种特殊的形式来访问。...基类的构造方法公开方法可以在类的外部直接访问,也可以被派生类继承。 在访问对象成员时,如果不存在则按照派生顺序逆序查找其基类是否存在该成员,如果都不存在则抛出异常。...__private() self.public() #私有方法在派生类不能直接访问 def __private(self): print('__private() method...() __private() method in A public() method in B #基类派生类的私有方法访问方式不一样 >>> dir(b) ['_A__private', '_B__private...', '__class__', ...] >>> class C(A): #显式定义构造函数 def __init__(self): #这里调用的是类C的私有方法

    2K50

    使用 Java 的反射机制调用私有方法原理详解

    文章目录 前言 一、私有方法在本类中直接调用 1、在本类实例化,调用私有方法 2、尝试在其他类直接调用私有方法(错误示范) 二、使用反射机制实例化类强制调用私有方法 1、使用类加载器加载被调用的类 2...---- 一、私有方法在本类中直接调用 1、在本类实例化,调用私有方法 说明:被 private 关键字修饰的构造方法方法或者数据域只在其所在的类可见。...2、尝试在其他类直接调用私有方法(错误示范) 如果我们直接在其他的类实例化Demo类,来直接调用demo()方法,就会发现 IDE 直接产生编译错误,很明显我们直接在另一个类调用私有方法是行不通的,...---- 总结 在我们的开发过程,通常只有实体类(Entity)的成员变量使用 private 修饰,并且会提供访问这些变量的 get set 方法。...原则上要求不准定义私有方法,我们使用 method.invoke(Object obj,Object args[]); 强制调用对象调用私有方法违反了我们 Java 面向对象的特性。 ?

    4K31

    python类的属性方法私有

    举例: def sayHello(self): print("hello,"+self.name) 二、类属性方法私有化 1.私有化的概念理解 私有化往往其实就是指只能被某些特定的对象调用...,我们可以采用类的名称前加一个下划线以及定义的整个私有方法名的拼接组合成一个新的方法名称就可以调用。..._Person__sayHello() 提问:为什么私有化的类可以被调用呢? 在python私有化的类方法在被编译的时候,实际上就是在这个方法名称前面拼接了下划线类的名称。...提问:私有化的调用方式如何知道的呢? 使用inspect库的getmembers方法可以访问到类的成员与方法。...三、总结强调 1.掌握类的属性的定义调用 2.掌握类的方法的定义调用 3.掌握类的属性方法私有化 4.掌握使用inspect库来查看类的所有的属性方法的成员。

    1.6K10

    创建子类对象时,父类构造函数调用被子类重写方法为什么调用的是子类的方法

    void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象的时候父类会调用子类方法...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存。...如果,子类重写了父类的方法,子类的方法引用会指向子类的方法,否则子类的方法引用会指向父类的方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译的时候,父类构造方法调用方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

    6.2K10

    干货:教你如何在JMeter调用Python代码N种方法

    (特别是针对一些只会Python编程, 不擅长Java的) 在JMeter调用Python方法有很多,今天给大家先推荐几种。...方法一:利用beanshell+Runtime.getRuntime().exec()方法 Runtime.getRuntime().exec() 方法是用于在 Java 应用程序执行外部命令。...它允许你调用操作系统的命令行工具或其他可执行程序。你可以将要执行的命令作为参数传递给 exec() 方法,并且它会返回一个 Process 对象,通过该对象你可以管理控制外部进程的执行。...方法二:利用JSR223 Sampler+jython 要在JMeter调用Python代码,也可以使用JSR223 Sampler元素来执行Python脚本操作步骤:1、在https://www.jython.org...percentile_milliseconds, 2000) if __name__ == "__main__": main() 执行后,自动生成output目录,并生成index.hmtl报告.

    85510

    没想到吧,PHP 在类的外部也可以调用私有方法

    一般来说,在 Class 的外部是无法调用私有方法,这也是 Private 字面的意思,但是一些很特殊很特殊的情况下,如果需要调用,是否可以呢?其实可以使用类的反射来实现。...reflection->getClosure($object); } return call_user_func_array($callback, $args); } 简单解释一下,首先还是简单判断该方法是否存在...,接着获取对象方法的放射,然后判断一下是不是公共的方法,如果是公共就正常调用,不是则获取其闭包,最后使用回调的方式来调用。...这个函数可以让你调用对象的私有或者受保护方法,建议一些特殊的情况下才使用。为了方便大家调用,新版的 WPJAM Basic 也会集成该函数。----

    1K30
    领券