是否可以使派生 class 的字段也被派生?
Is it possible to make the fields of a derived class also be derived?
假设我有一对 classes;
public class A {
public int value;
public A(int value) {
this.value = value;
}
}
public class B : A {
public B(int value) : base(value) { }
}
public class Base {
public A someobject;
public Base(A someobject)
{
this.someobject = someobject;
}
}
如果我想派生自class Base
,我可以这样写;
public class Derived : Base {
public Derived(A someobject) : base(someobject) { }
}
但是是否可以将 someobject
字段的数据类型更改为派生的子字段class,就像本例中那样?
public class Derived : Base {
public B someobject;
public Derived(B someobject) : base(someobject) { }
}
不,这不可能 - 这样做很危险。请注意:您当前使用的是 fields,而不是 properties,它们根本不允许您覆盖它们(尽管您 可以隐藏基域)。但是,即使有属性,您仍然无法在覆盖时更改 属性 的 return 类型。
考虑以下因素:
void Main()
{
Base myThing = new Derived();
//We view it as a Base object, so we can assign any Animal to MyAnimal
myThing.MyAnimal = new Cat();
//Now let's cast it back to Derived
Derived myCastThing = (Derived)myThing;
myCastThing.MyAnimal; //We expect a Dog, but we get a Cat?
}
public class Base
{
public virtual Animal MyAnimal { get; set; }
}
public class Derived : Base
{
public override Dog MyAnimal { get; set; }
}
public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }
您可以使用泛型实现您想要的,但是:
public class Base<TAnimalType> where TAnimalType : Animal
{
public virtual TAnimalType MyAnimal { get; set; }
}
public class Derived : Base<Dog>
{
public override Dog MyAnimal { get; set; }
}
假设我有一对 classes;
public class A {
public int value;
public A(int value) {
this.value = value;
}
}
public class B : A {
public B(int value) : base(value) { }
}
public class Base {
public A someobject;
public Base(A someobject)
{
this.someobject = someobject;
}
}
如果我想派生自class Base
,我可以这样写;
public class Derived : Base {
public Derived(A someobject) : base(someobject) { }
}
但是是否可以将 someobject
字段的数据类型更改为派生的子字段class,就像本例中那样?
public class Derived : Base {
public B someobject;
public Derived(B someobject) : base(someobject) { }
}
不,这不可能 - 这样做很危险。请注意:您当前使用的是 fields,而不是 properties,它们根本不允许您覆盖它们(尽管您 可以隐藏基域)。但是,即使有属性,您仍然无法在覆盖时更改 属性 的 return 类型。
考虑以下因素:
void Main()
{
Base myThing = new Derived();
//We view it as a Base object, so we can assign any Animal to MyAnimal
myThing.MyAnimal = new Cat();
//Now let's cast it back to Derived
Derived myCastThing = (Derived)myThing;
myCastThing.MyAnimal; //We expect a Dog, but we get a Cat?
}
public class Base
{
public virtual Animal MyAnimal { get; set; }
}
public class Derived : Base
{
public override Dog MyAnimal { get; set; }
}
public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }
您可以使用泛型实现您想要的,但是:
public class Base<TAnimalType> where TAnimalType : Animal
{
public virtual TAnimalType MyAnimal { get; set; }
}
public class Derived : Base<Dog>
{
public override Dog MyAnimal { get; set; }
}