Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:跨无关类共享属性、事件和方法_C#_Oop_Events - Fatal编程技术网

C#:跨无关类共享属性、事件和方法

C#:跨无关类共享属性、事件和方法,c#,oop,events,C#,Oop,Events,我需要将以下内容添加到几个不相关的类中: private MyClass myclass; private EventHandler clicked; public event EventHandler Clicked { ... } private bool enabled; public bool Enabled { ... } private void HandleClicked(object sender, EventArgs e) { ... } 问题是这些类是第三方的,不一定

我需要将以下内容添加到几个不相关的类中:

private MyClass myclass;

private EventHandler clicked;
public event EventHandler Clicked { ... }

private bool enabled;
public bool Enabled { ... }

private void HandleClicked(object sender, EventArgs e) { ... }
问题是这些类是第三方的,不一定共享同一个直接基类,尽管它们最终都从名为
View
的类继承。现在,我为每一个创建自己的子类,并复制粘贴相同的代码,这导致了不必要的重复


有什么方法可以有意义地重构它吗?

其中一种方法是使用组合。创建将存储所有新事件\属性\方法的类:

public class Properties
{
  private MyClass myclass;

  private EventHandler clicked;
  public event EventHandler Clicked { ... }

  private bool enabled;
  public bool Enabled { ... }

  private void HandleClicked(object sender, EventArgs e) { ... }
}
然后使用
扩展方法
扩展所需的接口(即classA)

用法如下所示:

var inst = new classA();
inst.Prop.Enabled = !inst.Prop.Enabled;
第二种方式它仍然是一种合成方式,但您将使用包装器来实现:

public class Wrapper
{
  private object _wrapped;

  public Wrapper(classA obj)
  {
    _wrapped = obj;
  }

  public Wrapper(classB obj)
  {
    _wrapped = obj;
  }

  public int WrappedProperty
  { 
    get
    {
      var instA = _wrapped as classA;
      if (instA != null)
        return instA.SomeProperty1;
      var instB = _wrapped as classB;
      if (instB != null)
        return instB.SomeProperty2;
    }
  }

  private MyClass myclass;

  private EventHandler clicked;
  public event EventHandler Clicked { ... }

  private bool enabled;
  public bool Enabled { ... }

  private void HandleClicked(object sender, EventArgs e) { ... }
}

第二种方法允许您创建新的包装层次结构,其中包含没有公共基类的元素。

继承在时间上会有问题。我建议改用接口,这样会有更多的灵活性

public interface INewInterfaces
{
    event EventHandler Clicked;
    bool Enabled { get; }
    void HandleClicked(object sender, EventArgs e);
}

public class NewClassA : ClassA, INewInterfaces
{
    //...
}

public class NewClassB : ClassB, INewInterfaces
{
    //...
}
编辑1:

如果您说ClassX非常相似,并且希望在所有这些不相关的类中使用相同的handleclick实现,那么您可以使用其他两种方法

1-静态继承

创建一个接口,并跨要使用的类添加所有公共函数。这将把ClassX放在同一个系列中。然后创建一个通用类

public interface IExistingInterfaces
{
    void SomeMethod();
}

public class NewClassA : ClassA, IExistingInterfaces
{
    //Do nothing
}

public class NewClassB : ClassB, IExistingInterfaces
{
    //Do nothing
}


public class MyClassForGeneralUse : IExistingInterfaces
{
    private IExistingInterfaces _baseObject;
    public MyClassForGeneralUse(IExistingInterfaces baseObject)
    {
        _baseObject = baseObject;
    }

    //Write proxy calls for IExistingInterfaces 
    public void SomeMethod()
    {
        _baseObject.SomeMethod();
    }

    //Add new methods here
    public void HandleClicked(object sender, EventArgs e)
    {

    }
    //...
    //...
}
不是:第一部分是桥牌图案,第二部分是装饰图案

2-反射

  var propertyInfo = someObject.GetType().GetProperty("property name");
    if (propertyInfo == null)
        throw new Exception(string.Format("Property does not exist:{0}", condition.Property));

    var propertyValue = propertyInfo.GetValue(someObject, null);
    long longValue = (long)propertyValue;

    //You can get methods in a smilar manner and execute with
    result = methodInfo.Invoke(methodInfo, parametersArray);

但反射可能有些过分。

添加更多代码。。。ppl将无法帮助您,我不知道为什么需要更多的代码。这是一个设计问题,在IMO中应该有一个通用的解决方案。此外,代码除了基本的事件/属性处理之外没有做任何特殊的事情。如果它是通用的,那么它就不会特定于您。是的,它可以被重构。。。但这也是你的代码,没有上下文,很多假设都是这样做的。。。不知道你是否听说过什么是假设;-)。如果它是通用的。。。然后只需使用抽象类/继承/接口。。。显示该代码。。。除了使用一般的oop技术,我没有足够的上下文来提出任何东西。谢谢。我考虑过这一点,但理想情况下,我不仅要重构声明,还要重构实现。这就是你的意思吗?
  var propertyInfo = someObject.GetType().GetProperty("property name");
    if (propertyInfo == null)
        throw new Exception(string.Format("Property does not exist:{0}", condition.Property));

    var propertyValue = propertyInfo.GetValue(someObject, null);
    long longValue = (long)propertyValue;

    //You can get methods in a smilar manner and execute with
    result = methodInfo.Invoke(methodInfo, parametersArray);