[英]Using Generics in Base Classes in C#: How to ensure methods in the base class return the derived class's type?
[英]How can I use a base type's methods, which return an object of the base type, in my derived type?
我正在尝试通过从Microsoft.Data.Analysis
继承DataFrame
来创建 class, ExtendedDataFrame
。 目标是添加一个Name
属性:
using Microsoft.Data.Analysis;
namespace Testing;
public class ExtendedDataFrame : DataFrame
{
public string Name { get; set; } = String.Empty;
public ExtendedDataFrame() : base() { }
public ExtendedDataFrame(string name) : base() => this.Name = name;
// Implement DataFrame's constructors:
public ExtendedDataFrame(string name, params DataFrameColumn[] columns) : base(columns)
{
this.Name = name;
}
public ExtendedDataFrame(string name, IEnumerable<DataFrameColumn> columns) : base(columns)
{
this.Name = name;
}
}
我可以构建一个ExtendedDataFrame
:
public class Program
{
public static void Main(string[] args)
{
StringDataFrameColumn col = new("foo", 0);
col.Append("bar");
col.Append("baz");
ExtendedDataFrame edf = new("EDF", col);
...
}
}
但是我失去了一些功能。 DataFrame
有一个Clone
方法。 我可以使用DataFrame
的Clone
方法创建一个DataFrame
:
// Note: Clone() returns a DataFrame object.
DataFrame df = edf.Clone();
但是,如果我不能使用DataFrame
的Clone
方法来创建ExtendedDataFrame
:
ExtendedDataFrame edf2 = (ExtendedDataFrame)df.Clone();
这会导致System.InvalidCastException: Unable to cast object of type 'Microsoft.Data.Analysis.DataFrame' to type 'DataFrameExtension.ExtendedDataFrame'.
这是有道理的,因为Clone
返回DataFrame
object 并且edf2
是一个ExtendedDataFrame
。
这让我想到了我的问题。 除了Clone
之外, DataFrame
还有其他返回DataFrame
对象的方法(如Filter
)。 有什么方法可以将这些方法与ExtendedDataFrame
对象一起使用吗? 或者,是否有另一种方法可以将Name
属性添加到DataFrame
?
听起来您正试图通过添加额外的东西(如 Name 属性)来增强“DataFrame”的功能,并且仍然使用底层的 DataFrame 逻辑,如 Clone() 和 Filter(),但您还希望增强这些方法以返回“ExtendedDataFrame”而不是“DataFrame”的实例。
您可能会考虑一种组合方法,让您更好地控制扩充类的公共 API。普通 inheritance 的问题是您无法更改 Clone()、Filter() 等的返回类型,除非有一些令人讨厌的解决方法。
使用组合,您将 DataFrame object 作为参数(或在内部创建),并将所有功能包装在您自己的自定义功能中。
像这样:
public class ExtendedDataFrame {
private readonly DataFrame _dataFrame;
public string Name { get; set; }
public ExtendedDataFrame(string name) {
this.Name = name;
this._dataFrame = new DataFrame();
}
protected ExtendedDataFrame(string name, DataFrame dataFrame) {
this.Name = name;
this._dataFrame = dataFrame;
}
public ExtendedDataFrame Clone() {
return new ExtendedDataFrame(this.Name, this._dataFrame.Clone());
}
// Other methods here
}
需要注意的是,您想要在增强数据框 class 上公开任何 DataFrame 方法,您需要在 class 中手动创建调用基础数据框上的方法的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.