iOS 多态的简单思想

/**
 *  多态:多种形态,是对于对象而言的,如果没有继承就没有多态
 *  
 *  在代码中体现:就是通过定义父类指针指向子类的对象
 *
 *  好处:在函数或者方法的参数中如果传入的是父类指针,那么实现的时候可以传入父类或者子类对象
 
         比如多个子类在完成同一个动作的时候,可以直接将父类指针作为参数传入,那么子类在实现的时候就可以将子类作为参数直接调用方法而完成功能。否则就要为每       一个子类写一个方法,这样就可以省略代码。
 
    局限性:父类类型的指针不能直接访问子类中特别的方法,如果要调用的话必须把父类的指针强制转换成为子 类类型
 *
 */

#import <Foundation/Foundation.h>

/************* Animal *************/
@interface Animal : NSObject
- (void)eat;
@end

@implementation Animal
- (void)eat
{
    NSLog(@"动物在吃东西");
}
@end


/************* Dog *************/
@interface Dog : Animal
- (void)eat;
@end

@implementation Dog
- (void)eat
{
    NSLog(@"狗在吃东西");
}
@end

/************* Cat *************/
@interface Cat : Animal
- (void)eat;
- (void)catchMouse;
@end

@implementation Cat
- (void)eat
{
    NSLog(@"猫在吃东西");
}

- (void)catchMouse { NSLog(@"猫抓老鼠"); } @end // "喂"所有的动物 定义函数实现 void feed(Animal *animal) { NSLog(@"给一块骨头"); } // main方法 int main() { // 对象的第一种形态:以“狗”的形态存在 Dog *dog1 = [Dog new]; /* 对象的第二种形态这种形态:以“动物”的形态存在 就是父类的指针指向子类的对象 定义一个“动物指针”dog2,指向“狗”类的对象的地址 */ Animal *dog2 = [Dog new]; /* 执行的时候会动态检测对象dog2的真实类型!是父类“Ainimal“呢还是子类”Dog”呢 打印结果是:狗在吃东西 说明dog2这个父类指针,在内存中指的还是子类”Dog“的内存地址,因此执行的是Dog类里面的方法 因此dog2还是”Dog“类型 */ [dog2 eat]; // 动态检测dog2到底是什么类型 /* 需求:喂”狗“和”猫“吃骨头 体现多态的优点 这样的话:就可以直接通过在函数中定义的父类指针指向所有的子类对象 这样写就可以直接在一个函数中完成”喂“和”狗“和”猫“的需求 */ Dog *dog3 = [Dog new]; feed(dog3); Cat *cat = [Cat new]; feed(cat); /* 多态的局限性:父类的指针不能直接访问子类特有的方法 */ Animal *cat1 = [Cat new]; /* [cat1 catchMouse]; 这样写在xCode中报错,在命令行工具中只是警告可以运行! cat1虽然是父类的指针,但是它指向的就是Cat类那么应该可以访问到Cat类里面的方法! 但是编译器会认为cat1是Animal类型,会在Animal类中寻找catchMouse方法,找不到结果报错! */ // 强制转换指针类型就可以了 Cat *c = (Cat *)cat1; // 首先将父类指针转换成为子类Cat的类型 [c catchMouse]; // 这样编译器认为catchMouse是在子类中,然后寻找到就不报错了! }

 

转载于:https://www.cnblogs.com/QM80/p/3569893.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中使用多态思想实现仓储系统可以通过抽象类和接口来实现。以下是一个简单的示例: 首先,定义一个抽象类 `Product`,表示产品: ```csharp public abstract class Product { public string Name { get; set; } public decimal Price { get; set; } public abstract void DisplayInfo(); } ``` 然后,定义两个具体的产品类,继承自 `Product`: ```csharp public class Book : Product { public string Author { get; set; } public override void DisplayInfo() { Console.WriteLine($"Book: {Name}, Author: {Author}, Price: {Price}"); } } public class Electronic : Product { public string Manufacturer { get; set; } public override void DisplayInfo() { Console.WriteLine($"Electronic: {Name}, Manufacturer: {Manufacturer}, Price: {Price}"); } } ``` 接下来,定义一个仓储类 `Warehouse`,负责管理产品的存储和展示: ```csharp public class Warehouse { private List<Product> products; public Warehouse() { products = new List<Product>(); } public void AddProduct(Product product) { products.Add(product); } public void DisplayProducts() { foreach (var product in products) { product.DisplayInfo(); } } } ``` 最后,在主函数中使用多态实现仓储系统: ```csharp static void Main(string[] args) { Warehouse warehouse = new Warehouse(); Book book = new Book() { Name = "Harry Potter", Author = "J.K. Rowling", Price = 19.99m }; Electronic electronic = new Electronic() { Name = "iPhone", Manufacturer = "Apple", Price = 999.99m }; warehouse.AddProduct(book); warehouse.AddProduct(electronic); warehouse.DisplayProducts(); } ``` 在这个例子中,`Product` 类作为抽象类,定义了共同的属性和方法,`Book` 和 `Electronic` 类通过继承 `Product` 类来实现具体的产品。`Warehouse` 类通过接收 `Product` 对象来存储和展示产品,通过调用 `DisplayInfo()` 方法实现多态,根据具体对象的类型来展示不同的信息。 这样,通过多态思想,可以方便地扩展和管理不同类型的产品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值