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

时间:2014-05-28 15:00:35

标签: c# .net 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;}
}

现在在某些方法中我填充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小时的某个地方视频,所以我们会说很少有虚拟属性,因为他们每次都不需要它们 - "很可能我理解错了并且认为虚拟财产可能是某种东西"在需求"对象"

所以我相信我的错,我会在某个时候再次拍摄视频。

2 个答案:

答案 0 :(得分:5)

注意 - 根据上述评论,您可能正在寻找an arraya generic (such as a list)a dictionary,或者您甚至可能希望实施{{3} }}。本回答的其余部分解释了何时使用关键字virtual


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

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

public class Camaro : Car {
    public override string Make {
        get { return "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"; }
        }
    }
    

    唯一的问题是你必须转换为子类类型才能获得具体的实现。换句话说,如果你有一个Car对象,你将永远得到&#34; Generic Make&#34;作为那辆车的品牌。你必须作为Camaro进行演员才能获得&#34;雪佛兰&#34;回<!/ p>

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

    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)。

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

答案 1 :(得分:3)

如果您预期某个类的继承者override成员或使用继承的实现,则将方法或属性声明为virtual


任何枚举Property1Property100的100个属性的类设计都很糟糕。此特性与是否应使用virtual关键字声明这些属性无关。