【问题标题】:Force instances to implement a method强制实例实现方法
【发布时间】:2018-07-31 06:11:55
【问题描述】:

可以强制派生类实现特定功能。

现在,是否可以分别对类的每个实例执行相同的操作? (可能在调用诸如 Java on-the-fly override 之类的构造函数时)

// on-the-fly override sample @Java
progressBar.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

    }
});

p.s:我只想为它创建一个实例。在这种情况下没有子类。

【问题讨论】:

  • 您所说的“是否可以对类的每个实例执行相同的操作?”是什么意思?实例无法实现任何东西,该类正在实现方法/功能。
  • 可以在 java 中为事件做这样的事情
  • 你可以尝试使用委托,只留下接受委托的构造函数
  • 如果您希望类的每个 instance 以不同的方式实现您的方法,您可以使用委托并在构造函数中提供它。
  • @HimBromBeere,这不一样。它不是那个问题的重复。 java特性是on-the-fly override,c#不直接支持。

标签: c# instance


【解决方案1】:

实例不能实现接口,只有类可以。在 Java 中也是不可能的。相反,会在后面创建一个派生自您的基类的匿名类,它显示为您的基类的一个实例。

要在 C# 中实现类似的功能,您可以使用委托并在类的构造函数中提供它:

class MyClass
{
    Action<T> TheAction { get; private set; }
    public MyClass(Action<T> doSomething() { this.TheAction = doSomething; }
}

现在您可以为每个实例提供不同的行为

var i1 = new MyClass(x => Console.WriteLine(x));
var i2 = new MyClass(x => DoSomething(x));

但是我不明白你为什么需要这个。要为进度条启用点击事件,只需执行以下操作:

myProgressBar.Click += (sender, args) => { /* what ever */ };

或:

myProgressBar.Click += MyMethod;

MyMethod(object sender, EventArgs args) { /* what ever */ }

【讨论】:

    【解决方案2】:

    Interfaces 可用于要求所有派生对象实现其方法 (see this)。不过,从这个声音来看,base.Method() 更符合您的要求 (see this):

    internal class A {
        public virtual void DoSomething() { }
    }
    internal class B : A {
        public override void DoSomething() { base.DoSomething(); }
    }
    

    以上内容对于确保在调用B.DoSomething 时执行A.DoSomething 中的代码很有用。

    使用interface 是我所知道的强制派生对象实现方法的唯一方法。

    【讨论】:

    • 你没有一个接口,而是一个带有虚方法的基类,你甚至没有必须覆盖它。 “使用接口是我知道强制派生对象实现方法的唯一方法”不,还有抽象类。
    • 更彻底地阅读这篇文章。我没有演示 interface 的实现,只演示了 base 的工作原理。另外,您在那里引用的短语;我明确表示这是我知道的唯一方法。不是唯一可用的方法。
    猜你喜欢
    • 2012-03-29
    • 2013-10-31
    • 2010-12-18
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多