C# 在嵌套枚举或嵌套类/结构之间进行选择
如果我需要一个类对象具有某个属性,让我们称它为“type” 我希望类型为“轮式”或“非轮式”。如果vehicle类的实例设置为具有轮式属性,我希望该属性还具有两个其他属性之一,例如“两轮”或“四轮”。 我尝试使用枚举来执行此操作,例如:C# 在嵌套枚举或嵌套类/结构之间进行选择,c#,enums,C#,Enums,如果我需要一个类对象具有某个属性,让我们称它为“type” 我希望类型为“轮式”或“非轮式”。如果vehicle类的实例设置为具有轮式属性,我希望该属性还具有两个其他属性之一,例如“两轮”或“四轮”。 我尝试使用枚举来执行此操作,例如: private enum wheeledTypes { twoWheeled, fourWheeled } private enum Wheels { a = wheeledTypes.twoWheeled, b = wheel
private enum wheeledTypes {
twoWheeled,
fourWheeled
}
private enum Wheels
{
a = wheeledTypes.twoWheeled,
b = wheeledTypes.fourWheeled,
c = nonWheeled
}
但正如你所看到的,我得到了三种类型(a/b/c,我不想要)。我只想要a/b,或者轮式/非轮式,其中轮式可以是两种类型
编辑:如果使用了类,您会期望它们本身具有属性、构造函数、方法等。我不要这个。我只想将车辆设置为轮式(2/4)或非轮式。轮式和非轮式不应具有进一步的属性。这就是为什么我认为枚举是合适的。也许我错了 你应该像这样上课:
class Vehicle { }
class NonWheeledVehicle : Vehicle { }
class WheeledVehicle : Vehicle
{
internal enum WheelTypes { TwoWheeled, FourWheeled }
}
public enum WheelType
{
TwoWeeled,
FourWeeled
}
public class Vehicle
{
}
public class WheeledVehicle : Vehicle
{
public WheelType WheelType { get; set; }
}
你会想要这样的东西:
class Vehicle { }
class NonWheeledVehicle : Vehicle { }
class WheeledVehicle : Vehicle
{
internal enum WheelTypes { TwoWheeled, FourWheeled }
}
public enum WheelType
{
TwoWeeled,
FourWeeled
}
public class Vehicle
{
}
public class WheeledVehicle : Vehicle
{
public WheelType WheelType { get; set; }
}
然后,车辆
是您的非轮式
车辆类型,有轮车辆
是您的车辆
,该车辆具有特定的车轮类型
使用类别
class Vehicle {
}
class Wheeled : Vehicle {
}
class NonWheeled : Vehicle {
}
class TwoWheeled : Wheeled {
}
class FourWheeled: Wheeled {
}
枚举不用作属性,而仅用作常量值(如整数、字符串等)的表示形式 您想要的是通过继承来实现的
// abstract if you do not want a vehicle to exist with having a concrete definition
public abstract class Vehicle {
}
public class NonWheeled : Vehicle{
}
public abstract class WheeledVehicle : Vehicle {
}
public class TwoWheeledVehicle : WheeledVehicle {
}
public class FourWheeledVehicle : WheeledVehicle {
}
public class ThousandWheeledVehicle : WheeledVehicle {
}
或者,根据您的需要,您可以将轮子的数量作为枚举保留为@rory.ap建议的只是一个建议,但为什么不简单地将属性设置为null呢?这样,如果它为null,则它是非轮式的,并且您仍然可以与枚举进行直接比较
enum Wheels{
twoWheeled,
fourWheeled
}
class AnyClass
{
public Wheels? Wheels{get;set;} //the question marks makes the property nullable
}
var a= new AnyClass{Wheels = Wheels.twoWheeled};
if(a.Wheels == null){} //unwheeled
if(a.Wheels.HasValue){} //wheeled
if(a.Wheels==Wheels.twoWheeled){} //direct check on specific type also works
我个人也喜欢添加一个暴露属性的接口。通过这种方式,您可以在该接口上创建扩展方法,例如
静态bool HasWheels(此IWheels wheelsObject)
为什么不使用继承?您不应该拥有一辆基本车辆
和一辆带有枚举WheelType
的儿童WheeledVehicle
?这里的无轮车辆在哪里?基类不是“vehicle”吗?除了你的两个派生类之外,还有3个派生类——“NonWheeledVehicle”。@Camilotervito--我想我读这个问题的速度有点太快了。但问题是,当你定义类时,你希望它们本身有属性、构造函数、方法等等。我不要这个。我只想将车辆设置为轮式(2/4)或非轮式。轮子和非轮子不应该有更多的属性。@StephenJohnson——不,那根本不是真的。正如我所展示的,类可以像空类型一样简单。它们只是工具,而且灵活且可扩展。一旦你接受了这个想法并在实践中反复使用它,你就会对它感到更舒服。这是如何让你只使用轮式和非轮式类型的呢?使用type of so if vehicle.GetType()==typeof(轮式)比它的轮子如果有轮子,车辆也会在下面。GetType()==typeof(双轮)是两轮的他想要两种,不是三种我只是给他一个建议,不是最后的代码。这是一种方法。这如何只提供轮式
和非轮式
类型?正确。增加了更多的抽象OP希望有两种类型:轮式和非轮式,其中轮式可能有2个或4个轮子。你给了他4种不同的类型。OP对枚举的理解完全错误。你也是对的,因此我也指出了@rory.ap的答案