You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何抽象类MD5可通过Create()实例化?求解析抽象类概念

抽象类无法实例化,但MD5.Create()能获取实例的原因解析
  • 你拿到的不是抽象类的实例,而是它子类的实例
    抽象类确实不能直接通过new MD5()实例化,但MD5.Create()是一个静态工厂方法——它的内部会创建MD5抽象类的具体实现子类(比如.NET中的MD5CryptoServiceProvider或MD5Cng),然后把这个子类实例向上转型为MD5类型返回。你代码里的md5变量是抽象类的引用,但实际指向的是子类的实例,这完全符合面向对象的多态规则。

  • 静态工厂方法的设计意图
    这类静态方法的作用就是隐藏具体实现细节,让调用者不用关心到底用了哪个子类,只需要和抽象类定义的规范(比如MD5的哈希计算方法)交互。比如MD5.Create()会根据系统环境自动选择最合适的MD5实现,调用者不需要手动去实例化具体子类。

  • 抽象类的核心价值
    抽象类的本质是定义一组必须遵守的规范(抽象方法、属性),强制子类去实现这些规范。它本身不能被实例化,但可以作为父类型来持有子类实例,这正是多态的核心体现——通过父类型统一操作不同的子类实现,同时屏蔽实现细节。

举个简化的代码示例,模拟这个逻辑:

// 抽象类
public abstract class MyAbstractHash
{
    // 静态工厂方法,返回子类实例
    public static MyAbstractHash Create()
    {
        return new MyConcreteHash();
    }

    // 抽象方法,定义规范
    public abstract byte[] ComputeHash(byte[] input);
}

// 具体实现子类
public class MyConcreteHash : MyAbstractHash
{
    public override byte[] ComputeHash(byte[] input)
    {
        // 具体哈希计算逻辑
        return new byte[0];
    }
}

// 调用方式和MD5一致
MyAbstractHash hash = MyAbstractHash.Create();
byte[] result = hash.ComputeHash(new byte[10]);

内容的提问来源于stack exchange,提问作者zxn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:01:10