是否有比通过注入使用基类更好的方法将继承的属性从基类快速获取到继承的类?



我问题的本质是有一个序列化对象来自我解析的数据库。 我将有 int 和 DateTime 字段以及其他字段。 我有相当于基本类型的四种不同子类型。 因此,可以考虑一下,因为它们每个都有不同的字段,但共享 ID 和创建日期。 我想节省时间,而不是有一个很长的构造函数来插入所有这些值,只需执行以下操作:

var base = new BaseTest(101, DateTime.Now.Date);
X inherited = (X)base;

但是,当然,这在 .NET 中是不行的,所以我想知道 - 我可以将 BaseClass 用作用于注入的完整 DTO 对象吗? 是的,我可以这样做,但它没有通过我的气味测试。 关于它的某些东西似乎不对劲,我觉得我以错误的方式解决问题,所以我很好奇是否有人有更好的主意。 最终目标是重用一个 Id 和 DateTime 字段,这些字段可以在我知道 SubType 对象是什么之前完成,然后以某种方式输入它而无需长构造函数。 到目前为止,我有这个:

public class BaseTest
{
public int BaseId { get; set; }
public DateTime Created { get; set; }
public BaseTest() { }
public BaseTest(int baseId, DateTime created)
{
BaseId = baseId;
Created = created;
}
}
public class X : BaseTest
{
public string Desc { get; set; }
public int Val { get; set; }
public X(string desc, int val, BaseTest baseValues)
{
Desc = desc;
Val = val;
BaseId = baseValues.BaseId;
Created = baseValues.Created;
}
}

class Program
{
static void Main(string[] args)
{
//This works for a reuse pattern but just doesn't feel right.
var b = new BaseTest(101, DateTime.Now.Date);
var p = new X("Test", 1, b);
Console.ReadLine();
}
}

我可以将构造函数更改为以下内容:

public X(string desc, int val, int baseId, DateTime created) : base(baseId, created)
{
Desc = desc;
Val = val;
}

但是我正在制作一个长构造函数。 所以真的我想我很好奇该语言是否可以将范围从基类缩小到继承以假设它的属性,但我认为它不能。

我在使用一些用于工作 VB.NET 代码时遇到了同样的问题,我通过让每个类都有一个"方便初始化构造函数"来满足它(可能有一个更好的术语,IIRC 它是 C++ 中的复制构造函数(。正如你提到的,我还没有找到一种真正改变形象的方法(可能比我聪明得多的人(,但我已经提出了上述想法(下面的示例(来帮助降低我的压力水平。

public class Foo
{
public int Id { get; set; }
public Foo() {}
public Foo(Foo foo) { Id = foo.Id; }
}
public class Bar : Foo
{
public string Name { get; set; }
public Bar(Foo foo, string name) : base(foo) { Name = name; }
public Bar(Bar bar) : base(bar) { Name = bar.Name; } // Allows further inheritance
}

这会产生一个小的可维护性缺陷:你有两个几乎相同的构造函数,但它允许你执行以下操作:

var foo = new Foo() { Id = 5 }
// Decide that `foo` should now be a `Bar`
var bar = new Bar(foo, "John");

这样,Bar真的不需要了解Foo的内部结构,只需要它可以从Foo和其他属性构建即可。这也有一个奇怪的副作用,即允许从BazFoo属性构建Bar

public class Baz : Foo
{
public DateTime BirthDate { get; set; }
public Baz(Foo foo, DateTime birthDate) : base(foo) { BirthDate = birthDate; }
public Baz(Baz baz) : base(baz) { BirthDate = baz.BirthDate; } // Allows further inheritance
}
var foo = new Foo() { Id = 5 };
var bar = new Bar(foo, "John");
var baz = new Baz(bar, DateTime.UtcNow);

最后,您甚至可以省略Bar(Foo foo, ...)构造函数中的其他参数,并使用属性初始化语法 (new Bar(foo) { Name = "John" }(,但该决定权由您决定。

最新更新