复杂多态实例
从编程角度理解多态的意义
理解多态:
- 首先在于和编译器“心有灵犀“:你可以在设计功能时更加自如挥洒,这也是通向高手的必经之路。
- 其次是在看源码的时候,可以和其他高手互相印证。
实例一:参数多态+特设多态(substrate/frame/executive/src/lib.rs)
这个例子是substrate的基础执行库,主要用到泛型结构体(参数多态) + 泛型约束(trait impl: 特设多态)
一个更加复杂的例子:来自substrate的lib.rs
#![allow(unused)] fn main() { /// Main entry point for certain runtime actions as e.g. `execute_block`. /// /// Generic parameters: /// - `System`: Something that implements `frame_system::Config` /// - `Block`: The block type of the runtime /// - `Context`: The context that is used when checking an extrinsic. /// - `UnsignedValidator`: The unsigned transaction validator of the runtime. /// - `AllPalletsWithSystem`: Tuple that contains all pallets including frame system pallet. Will be /// used to call hooks e.g. `on_initialize`. /// - `OnRuntimeUpgrade`: Custom logic that should be called after a runtime upgrade. Modules are /// already called by `AllPalletsWithSystem`. It will be called before all modules will be called. pub struct Executive< System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade = (), >( PhantomData<( System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade, )>, ); impl< System: frame_system::Config + EnsureInherentsAreFirst<Block>, Block: traits::Block<Header = System::Header, Hash = System::Hash>, Context: Default, UnsignedValidator, AllPalletsWithSystem: OnRuntimeUpgrade + OnInitialize<System::BlockNumber> + OnIdle<System::BlockNumber> + OnFinalize<System::BlockNumber> + OffchainWorker<System::BlockNumber>, COnRuntimeUpgrade: OnRuntimeUpgrade, > ExecuteBlock<Block> for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade> where Block::Extrinsic: Checkable<Context> + Codec, CheckedOf<Block::Extrinsic, Context>: Applyable + GetDispatchInfo, CallOf<Block::Extrinsic, Context>: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>, OriginOf<Block::Extrinsic, Context>: From<Option<System::AccountId>>, UnsignedValidator: ValidateUnsigned<Call = CallOf<Block::Extrinsic, Context>>, { fn execute_block(block: Block) { Executive::< System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade, >::execute_block(block); } } impl< System: frame_system::Config + EnsureInherentsAreFirst<Block>, Block: traits::Block<Header = System::Header, Hash = System::Hash>, Context: Default, UnsignedValidator, AllPalletsWithSystem: OnRuntimeUpgrade + OnInitialize<System::BlockNumber> + OnIdle<System::BlockNumber> + OnFinalize<System::BlockNumber> + OffchainWorker<System::BlockNumber>, COnRuntimeUpgrade: OnRuntimeUpgrade, > Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade> where Block::Extrinsic: Checkable<Context> + Codec, CheckedOf<Block::Extrinsic, Context>: Applyable + GetDispatchInfo, CallOf<Block::Extrinsic, Context>: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>, OriginOf<Block::Extrinsic, Context>: From<Option<System::AccountId>>, UnsignedValidator: ValidateUnsigned<Call = CallOf<Block::Extrinsic, Context>>, { ... } }