gpt4 book ai didi

c# - C#中抽象基类中的派生类实例化

转载 作者:行者123 更新时间:2023-11-30 17:45:14 25 4
gpt4 key购买 nike

我的目标是编写一个抽象基类,其中包含用于派生“子实例”的方法。在这个方法中已经完成了一些计算,这在所有派生类中都很常见。

难点在于基类不能自己创建子类。所以我在我的基类中引入了一个类型参数 T 和一个 protected abstract 方法,它应该返回一个 T 的实例。

public abstract class Base<T> where T : Base<T>
{
public T GetChild()
{
string param = ComplexComputation();
return NewInstanceFrom(param);
}

protected abstract T NewInstanceFrom(string param);
}

// --- somewhere else: ---

public class Derivative : Base<Derivative>
{
public Derivative() { }

protected sealed override Derivative NewInstanceFrom(string param)
{
return new Derivative(param);
}

private Derivative(string param)
{
// some configuration
}
}

这种方法的缺点是我无法确保 NewInstanceFrom 仅由基类调用。它也可以被继承自 Derivative 的类调用。这是我想避免的。

所以我可以将功能封装在私有(private)类或委托(delegate)中:

public abstract class Base<T> where T : Base<T>
{
public T GetChild()
{
string param = ComplexComputation();
return subElementDerivator(param);
}

protected Base<T>(Func<string, T> subElementDerivator)
{
this.subElementDerivator = subElementDerivator;
}

private Func<string, T> subElementDerivator;
}

// --- somewhere else: ---

public class Derivative : Base<Derivative>
{
public Derivative()
: base(deriveSubElement)
{
}

private Derivative(string param)
: base(deriveSubElement)
{
// some configuration
}

private static Derivative deriveSubElement(string param)
{
return new Derivative(param);
}
}

但这引入了一个新对象。

是否有更简单的方法来阻止 Derivative 的继承者访问功能(基类应有权访问)?

最佳答案

您可以使用显式接口(interface)实现来隐藏您的工厂方法。任何客户端仍然可以在转换后调用 Create 方法,但至少智能感知不会帮助开发人员。

public interface ISecretFactory<T>
{
T Create(string param);
}

public abstract class Base<T> where T : Base<T>, ISecretFactory<T>
{
public T GetChild()
{
// We are sure type T always implements ISecretFactory<T>
var factory = this as ISecretFactory<T>;
return factory.Create("base param");
}
}

public class Derivative : Base<Derivative>, ISecretFactory<Derivative>
{
public Derivative()
{

}

private Derivative(string param)
{

}

Derivative ISecretFactory<Derivative>.Create(string param)
{
return new Derivative(param);
}
}

public class SecondDerivative : Derivative
{
public void F()
{
// intellisense won't show Create method here.
// But 'this as ISecretFactory<Derivative>' trick still works.
}
}

关于c# - C#中抽象基类中的派生类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com