对象类是否具有虚成员
本文关键字:成员 是否 对象 | 更新日期: 2023-09-27 18:05:30
假设我创建了一个SomeObject类它有100个属性或成员,像这样,
Public Class SomeObject
{
Public string Property1 {get; set;}
Public string Property2 {get; set;}
Public string Property3 {get; set;}
Public string Property4 {get; set;}
.... so on
Public string Property100 {get; set;}
}
现在在一些方法中,我填充了2,3个属性并传递了对象,在代码的某个地方,我发送了50个中的50个。
如果我在这种情况下将这些属性更改为虚拟属性会有什么好处吗?
编辑:我唯一需要知道的是,如果我把上面的对象像这样传递给一个方法,SomeObject so1 = new SomeObject();
so1.Property1 = "something";
so1.Property2 = "something";
so1.Property3 = "something";
MethodA(so1);
现在我在项目的其他地方做这个,
SomeObject so2 = new SomeObject();
so1.Property1 = "something";
so1.Property2 = "something";
so1.Property3 = "something";
....
so1.Property100 = "something";
MethodB(so2);
这个方法有什么不对吗?)
编辑2:为什么我说我想使属性虚?因为我正在经历ASP。. NET MVC培训在微软虚拟培训学院和某个地方的6个小时的视频家伙说,我们将使一些属性虚拟,因为他们不需要他们每次-"最有可能我理解错了,认为虚拟属性可能是"按需"对象"
我想这是我的错,我以后会再讲一遍
注 -根据上面的注释,您可能正在寻找一个数组,一个泛型(如列表),一个字典,或者您甚至可能想要实现一个属性包。这个答案的其余部分解释了何时使用关键字virtual
。
将某些东西声明为virtual
的主要目的是让您可以编写基本实现,然后允许子类提供特定的实现。例如:
public class Car {
public virtual string Make {
get { return "Generic Make"; }
}
}
public class Camaro : Car {
public override string Make {
get { return "Chevy"; }
}
}
现在具体的实现返回"Chevy",但如果开发人员忘记覆盖它,它将返回"Generic Make"。
这里(至少)有两种选择:
使用
new
关键字隐藏基类实现:public class Car { public string Make { get { return "Generic Make"; } } } public class Camaro : Car { public new string Make { get { return "Chevy"; } } }
唯一的问题是,为了获得特定的实现,您必须转换为子类类型。换句话说,如果你有一个
Car
对象,你将总是得到"通用制造"作为那辆车的制造。你必须扮演一个Camaro
,才能让"雪佛兰"回来!另一个选择是在基类中使用受保护的属性,然后在子类中进行设置。这看起来像:
public class Car { protected string _carMake = "Generic Make"; public string Make { get { return _carMake; } } } public class Camaro : Car { public Camaro() : base() { _carMake = "Chevy"; } }
现在在基类上使用
Make
属性将返回适当的值(generic vs chevy)
如果您预计类的继承者将override
成员或使用继承的实现,则将方法或属性声明为virtual
。
任何有100个属性从Property1
枚举到Property100
的类都是糟糕的设计。该特性与是否应该使用virtual
关键字声明这些属性无关。