【问题标题】:C#: Can an _object_ override a class' method?C#:_object_ 可以覆盖类的方法吗?
【发布时间】:2010-11-10 06:20:48
【问题描述】:

我有一个示例类:

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() 是唯一的吗?谢谢。

【问题讨论】:

  • 从对象覆盖是什么意思? sampleObject 是一个变量而不是一个类型,你不能不能创建一个新的。
  • 我认为实例化甚至不会编译...

标签: c# object static-methods


【解决方案1】:

不,您不能基于每个对象进行覆盖。然而,如果你想给不同的对象不同的行为模型,你总是可以传入一个委托给构造函数:

public class ChildClass : SampleClass
{
   private readonly Action someMethodBehavior;

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

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

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

【讨论】:

  • 大声笑乔恩,小心你的答案有多好。像这样回答这个问题,就像是把双管霰弹枪给了一个新手来打脚! ;-)
  • 我想知道这是否可能与新的动态运行时有关。
  • @DrJokepu:你会对动态运行时做很多相同的事情。事实上,ExpandoObject 可以让您完全做到这一点,但是是动态的——您可以将委托分配给一个属性,然后在其他地方执行它。
【解决方案2】:

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

SampleClass sampleObject = new ChildClass();

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        听起来您可能做错了事,我不确定您为什么不创建具有被覆盖的 SomeMethod() 方法的子类,但是...

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 2010-10-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多