为何抽象类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
相关产品推荐
相关产品推荐

