例如,考虑.NET SHA256Managed类。
SHA256Managed继承自抽象类SHA256,它有一个名为Create()的方法。文档说Create()实例化SHA256的默认实现的实例。
我可能会写一些类似
的内容using (SHA256Managed Sha256Managed = new SHA256Managed())
{
// code
}
微软的例子选择使用:
SHA256 mySHA256 = SHA256Managed.Create();
Create()方法(来自基类)如何实例化从中派生的类的实例?
答案 0 :(得分:2)
函数可以返回任何你想要它的实例;)
在这种情况下,256Managed
的实例仍可投放到SHA256
这样的事情是完全可行的:
public class SHA256Managed
{
public static SHA256 Create()
{
return new SHA256Managed();
}
}
答案 1 :(得分:0)
类的方法或属性可以根据需要使用任何派生类(甚至自身作为字段)。语言没有限制,方法只能使用自己的对象和基类。
对于抽象类,唯一不能做的就是new
这样一个类的实例,调用此类的静态成员,返回任何非抽象类/结构的任何有效实例都是完全正常的。
以下有效代码显示可以返回您自己的甚至派生类:
class Base
{
public Derived Property1 {get;set;}
public Base Property2 {get;set;}
public static Base Create()
{
return new Derived();
}
public static Derived Create2()
{
return new Derived();
}
}
class Derived : Base
{
}
答案 2 :(得分:0)
通常,基类不应该对派生类有任何了解 - 但它可以实例化它想要的任何东西。
但是在SHA256的情况下,其Create()方法“实例化默认实现”,列为SHA256Managed。因为SHA256Managed没有create方法,所以它调用它的基类'Create()并获取自身的实例。只有当基本实现显式实例化像Alexei + Tom所示的SHA256Managed时才会发生这种情况:
public static SHA256 Create()
{
return new SHA256Managed();
}
答案 3 :(得分:0)
在SHA256
类中,Create
方法是一个静态方法,它返回'System.Security.Cryptography.SHA256'的默认实现的实例(根据方法文档)。此默认实现是SHA256Managed
- 非抽象子类SHA256
。
SHA256
和SHA256Managed
类在同一个程序集中定义,因此SHA256Managed
可以SHA256.Create
作为有效类使用。
这是一个带有静态Create
方法的抽象基类的示例,该方法创建非抽象派生类的实例:
public abstract class A
{
public static A Create()
{
return new B();
}
public abstract void DoSomething();
}
public class B : A
{
public override void DoSomething()
{
// do nothing.
}
}
有效的是,在编译这些成员的代码之前,编译器会为整个程序集构建类及其成员的列表。因此,在编译A.Create
方法时,编译器已经知道了类B
的存在和结构。
这也是为什么可以在之后将属性和方法放在之后引用它们的第一个点,如下所示:
class C
{
void some_method()
{
++counter;
}
int counter;
}
编译器在编译C
的代码之前已经知道了类some_method
的整个结构,因此它可以编译语句++counter;
而没有错误。
答案 4 :(得分:-1)
如果我没弄错的话你会想 SHA256Managed.Create()
正在调用Create()
基类的SHA256
方法。
Create()
方法是一种不可重写的静态方法,它是在SHA256Managed
类上使用new
关键字实现的。 se here for more info 德尔>
修改强>
因此,在深入挖掘(使用ILSPY)后,我发现Create()
的{{1}}方法并不那么简单,而是调用另一个类SHA256
。只是猜测有关CryptoConfig.CreateFromName
(派生类)的信息存在于某种配置机制中。
@ 280Z28:请你纠正