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