C# 在c中使用实例超类调用构造函数#
我有这个结构C# 在c中使用实例超类调用构造函数#,c#,inheritance,C#,Inheritance,我有这个结构 public class SuperClass{} public class InheritedClass : SuperClass{} 我希望实例化的超类成为继承类实例 var superClassInstance = new SuperClass(); InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ; 有人告诉我,如果不在构造函数中设置所有属性,这是行不通的。 对吗?是的,对。
public class SuperClass{}
public class InheritedClass : SuperClass{}
我希望实例化的超类成为继承类实例
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
有人告诉我,如果不在构造函数中设置所有属性,这是行不通的。
对吗?是的,对。没有内置的方法来提供您自己的基类对象来升级到子类。在调用子类的构造函数之前,每个子类都将构建自己的基类
您需要在复制所有相关数据的子类中编写自己的构造函数。是的,这是正确的。没有内置的方法来提供您自己的基类对象来升级到子类。在调用子类的构造函数之前,每个子类都将构建自己的基类 您需要在复制所有相关数据的子类中编写自己的构造函数 我希望实例化的超类成为继承类实例
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
这是不可能的。如果希望它是InheritedClass
的实例,则必须创建一个实例。您不能向上投射超类的实例
我希望实例化的超类成为继承类实例
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
这是不可能的。如果希望它是
InheritedClass
的实例,则必须创建一个实例。从某种意义上说,你不能向上投射一个超类的实例,是的,恐怕这是正确的。根据定义,构造函数就是创建一个新实例。因此,必须将现有实例中的任何内容复制到新实例中。可能是这样的:
public InheritedClass(SuperClass superClassInstance)
{
// base fields
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
// local fields
Field4 = "some value";
// etc.
}
public SuperClass(superClassInstance)
{
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
}
public class InheritedClass
{
public SuperClass BaseObject { get; private set; }
// other fields
}
或者,您可以将工作分为两个类,如下所示:
public InheritedClass(SuperClass superClassInstance)
{
// base fields
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
// local fields
Field4 = "some value";
// etc.
}
public SuperClass(superClassInstance)
{
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
}
public class InheritedClass
{
public SuperClass BaseObject { get; private set; }
// other fields
}
然后在派生类中:
public InheritedClass(superClassInstance)
: base(superClassInstance)
{
Field4 = "some value";
// etc.
}
相反,从继承类
创建一个超类
,变得容易多了,因为继承类
的任何实例都是超类
的实例,可以多态地解释为:
SuperClass someObject = inheritedClassInstance as SuperClass;
(请注意,这不是一个“新实例”,因此请注意引用错误。)您可以反过来做同样的事情:
InheritedClass someObject = superClassInstance as InheritedClass;
但是不能保证超类实例
也是继承类
的一个实例,因此您需要在此处检查错误。同样,这不是一个新的例子
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
使用组合而不是继承,您可以用更少的代码实现您的目标。例如,如果您有这样一个类:
public InheritedClass(SuperClass superClassInstance)
{
// base fields
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
// local fields
Field4 = "some value";
// etc.
}
public SuperClass(superClassInstance)
{
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
}
public class InheritedClass
{
public SuperClass BaseObject { get; private set; }
// other fields
}
然后,您可以在InheritedClass
中包含一个构造函数,它只设置一个对象:
public InheritedClass(SuperClass superClassInstance)
{
BaseObject = superClassInstance;
}
但是,请再次注意,这不是属性中的超类
的新实例,而是对现有实例的引用。为了确保新的实例,您仍然需要编写手动代码(可能是在超类上的.Copy()
或.Clone()
方法中)来复制实例
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
简言之,在我进行了所有无方向的头脑风暴之后,一个字段一个字段地克隆一个实例将需要将该字段一个字段地放在某个地方。从某种意义上说,是的,恐怕这是正确的。根据定义,构造函数就是创建一个新实例。因此,必须将现有实例中的任何内容复制到新实例中。可能是这样的:
public InheritedClass(SuperClass superClassInstance)
{
// base fields
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
// local fields
Field4 = "some value";
// etc.
}
public SuperClass(superClassInstance)
{
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
}
public class InheritedClass
{
public SuperClass BaseObject { get; private set; }
// other fields
}
或者,您可以将工作分为两个类,如下所示:
public InheritedClass(SuperClass superClassInstance)
{
// base fields
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
// local fields
Field4 = "some value";
// etc.
}
public SuperClass(superClassInstance)
{
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
}
public class InheritedClass
{
public SuperClass BaseObject { get; private set; }
// other fields
}
然后在派生类中:
public InheritedClass(superClassInstance)
: base(superClassInstance)
{
Field4 = "some value";
// etc.
}
相反,从继承类
创建一个超类
,变得容易多了,因为继承类
的任何实例都是超类
的实例,可以多态地解释为:
SuperClass someObject = inheritedClassInstance as SuperClass;
(请注意,这不是一个“新实例”,因此请注意引用错误。)您可以反过来做同样的事情:
InheritedClass someObject = superClassInstance as InheritedClass;
但是不能保证超类实例
也是继承类
的一个实例,因此您需要在此处检查错误。同样,这不是一个新的例子
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
使用组合而不是继承,您可以用更少的代码实现您的目标。例如,如果您有这样一个类:
public InheritedClass(SuperClass superClassInstance)
{
// base fields
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
// local fields
Field4 = "some value";
// etc.
}
public SuperClass(superClassInstance)
{
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
}
public class InheritedClass
{
public SuperClass BaseObject { get; private set; }
// other fields
}
然后,您可以在InheritedClass
中包含一个构造函数,它只设置一个对象:
public InheritedClass(SuperClass superClassInstance)
{
BaseObject = superClassInstance;
}
但是,请再次注意,这不是属性中的超类
的新实例,而是对现有实例的引用。为了确保新的实例,您仍然需要编写手动代码(可能是在超类上的.Copy()
或.Clone()
方法中)来复制实例
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
简言之,在我进行了所有无方向的头脑风暴之后,一个字段一个字段地克隆一个实例需要将该字段一个字段地放在某个地方。好的,这里(a和b字段用于演示):
所以你可以
var super = new SuperClass();
var inherited = new InheritedClass(super);
.好的,这里(a和b字段用于演示):
所以你可以
var super = new SuperClass();
var inherited = new InheritedClass(super);
是的。。不能直接赋值,必须在构造函数中进行传递
相反
您应该创建接口并将接口实现到传递值的类中
现在,在intoInheritedClass
中,创建以接口为参数的构造函数,这样,分配给第一个类的任何值都将被传递到InheritedClass
在这里,您可以完全访问一流酒店
请参阅下面的dotnetfiddle url
是的。。不能直接赋值,必须在构造函数中进行传递
相反
您应该创建接口并将接口实现到传递值的类中
现在,在intoInheritedClass
中,创建以接口为参数的构造函数,这样,分配给第一个类的任何值都将被传递到InheritedClass
在这里,您可以完全访问一流酒店
请参阅下面的dotnetfiddle url
I