0

我有一个示例类:

class SampleClass
{
   public virtual string SomeProperty{get; set;}
   public virtual void SomeMethod() {
      // code
   }
}

我可以继承它并像这样覆盖 SomeProperty 和 SomeMethod :

class ChildClass:SampleClass
{
   public override string SomeProperty{get; set;}
   public override void SomeMethod() {
      // code
   }
}

有什么方法可以从对象而不是类中覆盖?像

SampleClass sampleObject = new sampleObject();

并且 sampleObject.SomeMethod() 是唯一的吗?谢谢。

4

8 回答 8

11

不,您不能基于每个对象覆盖。但是,如果你想为不同的对象提供不同的行为模型,你总是可以将委托传递给构造函数:

public class ChildClass : SampleClass
{
   private readonly Action someMethodBehavior;

   public ChildClass(Action someMethodBehavior) {
       this.someMethodBehavior = someMethodBehavior;
   }

   public override void SomeMethod() {
      someMethodBehavior();
   }
}

这允许每个对象有效地指定自己的行为。如果您希望它成为一种选择加入覆盖,您甚至可以允许空委托引用表示“仅执行默认操作”。

于 2009-07-13T10:48:43.033 回答
3

不完全确定你想要完成什么,但你会做

SampleClass sampleObject = new ChildClass();

然后,您可以将 sampleObject 传递给任何采用 SampleClass 的函数,即使它实际上是 ChildClass,并且由于您的函数是虚拟的,因此将调用您的覆盖函数。

于 2009-07-13T10:42:48.863 回答
2

不 - 您无法从对象中覆盖!实际上,我认为您误解了对象是什么-对象是类的实例。对象本身没有定义的方法和属性,它们来自对象“所属”的类。

在我看来,如果你需要尝试做这种事情,那么你就走错了路……

于 2009-07-13T10:45:39.670 回答
1

你的问题有点不清楚,但我认为你不能完全按照你的意愿去做——匿名类在 C# 中不存在,就像在 Java 中一样。您需要为该实例创建一个子类和方法覆盖。您可以在您声明代码的类中将子类设为私有,这样它只能作为 SampleClass 访问,而不是 ChildClass

于 2009-07-13T10:47:04.800 回答
1

听起来您可能会以错误的方式进行操作,我不确定您为什么不使用覆盖的SomeMethod()方法创建子类,但是...

唯一的方法可能是显式创建类时牢记这一点,并保留委托属性。然后SomeMethod()会调用委托(大概是在创建对象时设置的)。

但是,仍然不允许代表访问私有成员或受保护成员 - 至少没有通过一些巧妙的参数 - 所以我真的看不出有多大用处。

于 2009-07-13T10:47:48.183 回答
0

不,这在 C# 中是不可能的。您必须创建一个具有所需行为的新类。

于 2009-07-13T10:45:47.737 回答
0

类是其实例的蓝图...为什么要创建没有蓝图的对象...

所有运行时都限制您在没有蓝图的情况下创建对象,但是您可以使用该对象来访问其蓝图,这称为反射......一个对象反映了它的蓝图。

于 2009-07-13T10:46:20.697 回答
0

我认为最能描述你假装的是 Java 中的匿名类。但是,C# 不允许您使用匿名类型覆盖方法,实际上也不允许您覆盖任何内容。

于 2009-07-13T10:50:37.210 回答