繁体   English   中英

如何在我的派生类型中使用基类型的方法,这些方法返回基类型的 object?

[英]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方法。 我可以使用DataFrameClone方法创建一个DataFrame

// Note: Clone() returns a DataFrame object.
DataFrame df = edf.Clone();

但是,如果我不能使用DataFrameClone方法来创建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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM