我想在自定义dll中覆盖ClassA的方法Print。
public ClassA
{
public void Print( string arg1, string arg2, string arg3, string arg4 )
{
}
}
这在C#中是否可行?
答案 0 :(得分:1)
我相信微软研究院的Moles也做了类似的事情。它们有一个允许你覆盖例如工作的系统。 DateTime.Now
,强制它返回特定的日期/时间。
有关详细信息,请查看http://research.microsoft.com/en-us/projects/pex/default.aspx。
答案 1 :(得分:1)
这与你提出的问题不太一样,但它也会产生类似的效果......
为什么不为您的操作定义接口。 ClassA实现了接口。您的自定义策略也实现了界面。 ClassA在启动时(在实例化ClassA时)内部创建接口的“默认”实现,但也具有允许设置接口的属性。该接口甚至可以允许自定义策略指定它实际实现的接口的哪些成员:
interface IStrategy
{
void Operation1(int x, int y);
void Operation2(string a, string b);
}
class ClassA : IStrategy
{
private IStrategy builtInStrategy = new BuiltInStrategy();
public IStrategy CustomStrategy { get; set; }
void Operation1(int x, int y);
{
if (CustomStrategy != null)
{
CustomStrategy.Operation1(x, y);
}
else
{
builtInStrategy.Operation1(x, y);
}
}
void Operation2(string a, string b)
{
if (CustomStrategy != null)
{
CustomStrategy.Operation2(a, b);
}
else
{
builtInStrategy.Operation2(a, b);
}
}
}
您可以指定IStrategy接口的一部分,以便自定义策略指示它不会“覆盖”特定操作。也许它可以返回bool
而不是空格,或者如果自定义策略没有覆盖操作,每个操作可能都有一个out bool
参数设置为false。
根据可以覆盖的操作数量,您甚至可以考虑将每个操作放在自己的界面上。如果在没有实现其他操作的情况下实现一个操作是不合理的,则可以将操作分组到接口中。
interface IOperation1
{
void Operation1(int x, int y);
}
interface IOperation2
{
void Operation2(string a, string b);
}
interface IMath
{
int Add(int i, int j);
int Subtract(int i, int j);
int Multiply(int i, int j);
int Divide(int i, int j);
}
interface IStrategy
{
//What operations should the Strategy have?
}
class ClassA : IOperation1, IOperation2, IMath
{
public IStrategy CustomStrategy { get; set; }
public void Operation1(int x, int y)
{
IOperation1 op1 = CustomStrategy as IOperation1;
if (op1 != null)
{
op1.Operation1(x, y);
}
else
{
//Do ClassA's Operation1 logic here
}
}
public void Operation2(string a, string b)
{
IOperation2 op2 = CustomStrategy as IOperation2;
if (op2 != null)
{
op2.Operation2(a, b);
}
else
{
//Do ClassA's Operation2 logic here
}
}
//
// And so on ...
//
}
答案 2 :(得分:0)
您的第一个问题:该方法未标记为virtual
。你不能override
非虚方法。
至于问题,这完全取决于ClassA
如何实例化和使用。例如,您可以在运行时创建派生类型,如果您可以控制它的实例化和使用。
答案 3 :(得分:0)
这是不可能的,因为我无法扩展ClassA,因为它在随应用程序提供的Core dll中