是否具有虚拟成员的对象类?

Mat*_*ics 1 .net c# oop

假设我创建了一个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;}
}
Run Code Online (Sandbox Code Playgroud)

现在在一些方法上我填充2,3个属性并传递对象和代码中的某个地方我发送50个中的50个.

如果我在这种情况下将这些属性更改为虚拟属性,这会有什么好处吗?

编辑:

我唯一需要知道的是,如果我将这样的对象传递给方法,

SomeObject so1 = new SomeObject();
so1.Property1 = "something";
so1.Property2 = "something";
so1.Property3 = "something";

MethodA(so1);
Run Code Online (Sandbox Code Playgroud)

现在在项目的其他地方我这样做,

SomeObject so2 = new SomeObject();
so1.Property1 = "something";
so1.Property2 = "something";
so1.Property3 = "something";
....
so1.Property100 = "something";
MethodB(so2);
Run Code Online (Sandbox Code Playgroud)

这种方法有什么不对:)

编辑2:

为什么我说我想让属性虚拟化?因为我正在通过微软虚拟培训学院的ASP.NET MVC培训和6小时内的某个地方视频,所以我们会说几个属性是虚拟的,因为他们每次都不需要它们 - "很可能我理解它错了,并且认为虚拟属性也许是"ON DEMAND"对象"

所以这是我的错,我相信,我会在某些时候再次拍摄视频.

dre*_*w_w 5

- 根据上面的注释,您可能正在寻找一个数组,一个通用(如列表),一个字典,或者您甚至可能想要实现一个属性包.本答案的其余部分解释了何时使用关键字virtual.


声明某些内容的主要目的virtual是为了编写基本实现,然后允许子类提供特定的实现.以下面的例子为例:

public class Car {
    public virtual string Make {
        get { return "Generic Make"; }
    }
}

public class Camaro : Car {
    public override string Make {
        get { return "Chevy"; }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在具体的实现返回"Chevy",但如果开发人员忘记覆盖它,它将只返回"Generic Make".

这里有(至少)两种选择:

  1. 使用new关键字隐藏基类实现:

    public class Car {
        public string Make {
            get { return "Generic Make"; }
        }
    }
    
    public class Camaro : Car {
        public new string Make {
            get { return "Chevy"; }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    唯一的问题是您必须转换为子类类型才能获得特定的实现.换句话说,如果你有一个Car物体,你总会得到"通用制造"作为该车的品牌.Camaro为了获得"雪佛兰"的制作,你必须投出一个!

  2. 另一种选择是在基类中使用受保护的属性,然后在子类中设置.这看起来像:

    public class Car {
        protected string _carMake = "Generic Make";
        public string Make {
            get { return _carMake; }
        }
    }
    
    public class Camaro : Car {
        public Camaro() : base() {
            _carMake = "Chevy";
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    现在使用Make基类上的属性将返回适当的值(generic vs chevy).

在线学习类,继承和覆盖行为可能有很多好的资源.希望这至少可以让你开始!