Tag: 摘要

c#中的抽象枚举

有没有办法在C#中制作( protected ) enum abstract ? 基类示例: protected abstract enum commands{}; //CS0106 protected abstract void useCommands(commands meh); 这不会编译,因为“ abstract对此项无效”。 是否有一种工作方式来实现所期望的行为?

抽象属性是否会创建私有支持字段?

简单问题:抽象属性是否创建了私有支持字段? 例: public abstract Name { get; set; } 这会创建一个私人支持领域吗? 我想强制任何派生此属性的类使用自己的支持字段,而不是编译器创建的支持字段。

创建一个在c#中实现多个接口的抽象类

我想在c#中创建一个抽象类,它从不同的接口“inheritance”,但是将具体的实现留给了子类。 然而,编译器抱怨说,该类没有实现接口中指定的方法。 我已经习惯了Java总是有效的,所以我不确定它应该如何在c#中工作。 无论如何,这是我的代码: public abstract class MyClass : IDisposable, IPartImportsSatisfiedNotification { private string name; public MyClass(string name) { this.name = name; } }

在覆盖中向属性添加setter

为什么在实现接口时允许更改属性中getter或setter的可见性和存在? interface IFoo { string Bar { get; } } class RealFoo : IFoo { public RealFoo(string bar) { this.Bar = bar; } public string Bar { get; private set; } } class StubFoo : IFoo { public string Bar { get; set; } } ……在实现抽象类时,做同样的事情并不合法吗? abstract class AbstractFoo : IFoo { public abstract string […]

虚拟类中的抽象方法

我有一个具有许多虚方法的ac #Class,其中一些方法基本上是抽象的(它们完全在子类中实现,基类是空的)。 为了让它进行编译,我在基类中抛出一个InvalidOperationException,并对应该做什么做出评论。 这只是感觉很脏。 有没有更好的方法来设计我的课程? 编辑:对于将在加拿大运行的应用程序的中间层,一半的方法是通用的,因此是虚拟的。 一半的方法都是省特定的。 Public class PersonComponent() { public GetPersonById(Guid id) { //Code to get person – same for all provinces } Public virtual DeletePerson(Guid id) { //Common code } Public virtual UpdatePerson(Person p) { throw new InvalidOperation(“I wanna be abstract”); } Public Class ABPersonComponent : PersonComponent { public override DeletePerson(Guid id) […]

DataContract序列化抽象类

我有一个接口IServiceInfo和一个抽象类ServiceInfo。 有几个inheritance自ServiceInfo的类,如CoreServiceInfo,ModuleServiceInfo等。有一个名为RootService的服务契约,它返回IServiceInfo。 public IServiceInfo GetServiceInfo() { return (IServiceInfo)new CoreServiceInfo(); } 我有序列化问题。 我可以使用ServiceKnownType来标识基类,使用KnownType来标识子类。 问题是我不知道所有的ServiceInfo子节点,因为应用程序可以有从ServiceInfoinheritance的不同子节点的插件,所以我不能告诉序列化器将序列化XML中的所有子节点。 我可以忽略抽象类,但它包含某些常见的实现,所以我需要保留它。 作为一种解决方法,我可以让另一个类说“sampleServiceInfo”并将所有info类转换为sampleServiceInfo并从Service方法返回它,并将KnownType定义为ServiceInfo类。 [KnownType(typeof(sampleServiceInfo))] public class ServiceInfo : IServiceInfo 但这听起来并不是很好的方式。 请建议。 我需要编写自定义序列化程序吗? 是否有任何方法只能序列化base并且当两者都有相同的成员时忽略它?

为什么C#允许没有抽象成员的抽象类?

C#规范第10.1.1.1节规定: 允许(但不是必需)抽象类来包含抽象成员。 这允许我创建这样的类: public abstract class A { public void Main() { // it’s full of logic! } } 甚至更好: public abstract class A { public virtual void Main() { } } public abstract class B : A { public override sealed void Main() { // it’s full of logic! } } 这真是一个具体的课程; 它只是抽象的,因为人们无法实例化它。 例如,如果我想在B.Main()执行逻辑,我将首先得到B的实例,这是不可能的。 […]

用虚拟方法覆盖抽象方法

我试图在子类中使用虚方法覆盖抽象类中的抽象方法。 我(假设到现在?)理解抽象方法和虚方法之间的区别。 显然我无法做到,但我的问题是……为什么? 基于此处接受的答案和以下场景,我只是没有看到问题: public abstract class TopLevelParent { protected abstract void TheAbstractMethod(); } public class FirstLevelChild1 : TopLevelParent { protected override void TheAbstractMethod() { } } public class FirstLevelChild2 : TopLevelParent { protected virtual override void TheAbstractMethod() { //Do some stuff here } } public class SecondLevelChild : FirstLevelChild2 { //Don’t need to re-implement […]

如何在.NET类库中创建“抽象”枚举?

我正在创建一个服务器库,其中数据包关联由枚举完成。 public enum ServerOperationCode : byte { LoginResponse = 0x00, SelectionResponse = 0x01, BlahBlahResponse = 0x02 } public enum ClientOperationCode : byte { LoginRequest = 0x00, SelectionRequest = 0x01, BlahBlahRequest = 0x02 } 当你在自己的项目中工作时,这可以正常工作 – 你可以比较返回哪个枚举成员(即if (packet.OperationCode == ClientOperationCode.LoginRequest) )。 但是,由于这是一个类库,用户必须定义​​自己的枚举。 因此,我有两个枚举添加为“抽象” – ServerOperationCode和ClientOperationCode。 我知道在C#中实现抽象枚举是不可能的。 我该怎么做呢?

将抽象readonly属性覆盖为读/写属性

我想只强制从基本抽象类在给定属性上实现C#getter。 如果需要,派生类可以为该属性提供一个setter,以供公共使用静态绑定类型。 给出以下抽象类: public abstract class Base { public abstract int Property { get; } } 如果我想要一个也实现了setter的派生类,我可以天真地尝试: public class Derived : Base { public override int Property { get { return field; } set { field = value; } // Error : Nothing to override. } private int field; } 但是后来我遇到语法错误,因为我试图覆盖不存在的setter。 我尝试了其他一些方法,例如声明基本setter私有等等,我仍然偶然发现所有类型的错误阻止我这样做。 必须有办法做到这一点,因为它不会破坏任何基类合同。 顺便说一句,它可以用接口完成,但我真的需要默认实现。 我经常偶然发现这种情况,我想知道是否有隐藏的C#语法技巧,否则我将使用它并实现手动SetProperty()方法。