Tag: inheritance

静态初始化inheritance的静态成员

考虑以下示例代码: public class A { public static T TheT { get; set; } } public class B : A { static B() { TheT = “Test”; } } public class Program { public static void Main(String[] args) { Console.WriteLine(B.TheT); } } 这里B.TheT为空。 但是,更改Main方法如下: public static void Main() { new B(); Console.WriteLine(B.TheT); } 正如预期的那样, B.TheT是“测试”。 我可以理解这会强制静态构造函数运行,但为什么第一种情况不会发生这种情况呢? […]

表单设计器打破通用抽象UserControl

我有一个通用的抽象UserControl类, SensorControl ,我希望我的所有传感器控制面板都可以inheritance。 问题 尝试设计EthernetSensorControl (我inheritance的UserControl表单之一,在Visual Studio中,表单设计器中显示以下错误: 无法为此文件显示设计器,因为其中的任何类都无法设计。 设计人员检查了文件中的以下类:DeviceSensorControl —无法加载基类“Engine.Sensors.SensorControl”。 确保已引用程序集并且已构建所有项目。 SensorControl类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace Engine.Sensors { public abstract class SensorControl : UserControl where SensorType : class { protected SensorType _sensor; public SensorControl(SensorType sensor) { _sensor = sensor; } } } 示例inheritance类, EthernetSensorControl : namespace Engine.Sensors { […]

从TypeBuilder创建具有基类和附加字段的动态类型会生成exception

我正在尝试基于仅包含公共字段的现有类型创建动态类型。 新的动态类型还必须从仅具有完全实现的方法的不同基类型inheritance。 我创建TypeBuilder指定基类型然后我将公共字段添加到它,最后我调用CreateType() 。 生成的错误消息是: “无法从程序集’MyDynamicAssembly,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null’加载类型’InternalType’,因为字段’first’未被赋予显式偏移量。” 对我来说,这意味着CreateType方法在基类中寻找公共字段“first”,这是一个问题,因为它不在那里。 为什么它认为添加的字段应该在基类中? 或者,我是否误解了这个例外? 这是代码: public class sourceClass { public Int32 first = 1; public Int32 second = 2; public Int32 third = 3; } public static class MyConvert { public static object ToDynamic(object sourceObject, out Type outType) { // get the public fields […]

在不知道类型的情况下返回通用

我有一种情况,我有一个类,在其generics类型参数中接受某个对象类型的实例。 布局是这样的: public abstract BaseClass { … } public DiamondClass : BaseClass { … } public SilverClass : BaseClass { … } public Handler where T : BaseClass { … } 我希望能够创建一个方法来返回Handler或Handler的实例,而无需在输入时定义类型。 我试过这些方面的东西: public Handler GetHandler(HandlerType type) { switch(type) { case HandlerType.Diamond: return new Handler(); case HandlerType.Silver: return new Handler(); default: throw new InvalidOperationException(“…”); } […]

C#接口实现关系只是“可以做”的关系?

今天有人告诉我,C#中的接口实现只是“Can-Do”关系,而不是“Is-A”关系。 这与我长期相信LSP(Liskov Substitution Principle)相冲突。 我一直认为所有的inheritance应该意味着“Is-A”的关系。 所以,如果接口实现只是一个“可以做”的关系。 如果有一个界面“IHuman”和“IEngineer”,并且一个类“Programmer”inheritance自“IHuman”和“IEngineer”怎么办? 当然,“程序员”是“IHuman”和“IEngineer”。 如果它只是“Can-Do”关系,是否意味着我们不能指望“程序员”实例行为在被视为IHuman并被视为IEngineer时可能会有所不同?

在构造函数中访问已实现的抽象属性会导致CA2214:不要在构造函数中调用可覆盖的方法

public abstract class MyBase { public abstract bool MyProperty { get; protected set; } } public class MyClass : MyBase { public MyClass() { this.MyProperty = true; } public override bool MyProperty { get; protected set; } } 构造函数MyClass()导致CA2214: 不要在构造函数中调用可覆盖的方法。 这通常仅显示是否调用与构造函数在同一类中定义的虚方法。 例如,在MyBase的构造函数中访问MyProperty 。 这里我在派生类的构造函数中调用inheritance的抽象属性的非虚拟重写实现 。

.Netinheritance和方法重载

这是一个代码示例: class Program { static void Main(string[] args) { var obj = new DerivedClass(); obj.SomeMethod(5); } } class BaseClass { internal void SomeMethod(int a) { } } class DerivedClass : BaseClass { internal void SomeMethod(long a) { } } 有人可以解释一下为什么派生类调用的方法(而不是基类方法)? 我需要详细解释这种情况。 我将非常感谢任何有用文章的链接。 谢谢。

Specflow测试步骤inheritance导致“不明确的步骤定义”

我想拥有以下测试步骤类结构: [Binding] public class BaseStep { [Given(@”there is a customer”)] public void GivenThereIsACustomer(Table table) { HandleCustomer(table); } protected virtual void HandleCustomer(Table table) { } } [Binding] public class FeatureOneStep : BaseStep { protected override void HandleCustomer(Table table) { // feature one action } [Given(@”feature one specific step”)] public void GivenFeatureOneSpecificAction(Table table) { // do something […]

C#中的类和基类inheritance

我在C#中有一个类,如下所示: public class BarChart { public BarData BarChartData; public BarStyle BarChartStyle; public BarChart(BarData data, BarStyle style) { this.BarChartData = data; this.BarChartStyle = style; } string _uniqueName; public string UniqueName { get { return this._uniqueName; } set { this._uniqueName = value; } } string _rowNumber; public string RowNumber { get { return this._rowNumber; } set { […]

一种返回派生类实例的抽象方法

是否有可能创建一个必须返回派生类实例的抽象方法? 我可以做这个: abstract class Base { public abstract Base GetObj(); } class Derived : Base { public Derived() { } public override Base GetObj() { return new Derived(); } } 但我想知道是否有办法做到这一点, Derived::GetObj()被迫返回Derived ? 谢谢。