C# 继承的扩展?

C# 继承的扩展?,c#,.net,design-patterns,C#,.net,Design Patterns,我有一门课: class A { method 1 method 2 method 3 } 现在我想添加一个新方法:方法4,因为我不能修改类a文件。 最佳做法是什么: 1.我应该使用扩展吗? 2.我应该继承一个新方法,然后在那里实现新方法吗?如果是,子类的名称是什么 稍后,我希望能够做到: A ains=new A(); //A or other name ains.method4(); 听起来你需要使用一个扩展,但是如果没有更多的信息就很难说了。继承是指当子对象是a

我有一门课:

class A {
    method 1
    method 2
    method 3
}
现在我想添加一个新方法:方法4,因为我不能修改类a文件。 最佳做法是什么:
1.我应该使用扩展吗?
2.我应该继承一个新方法,然后在那里实现新方法吗?如果是,子类的名称是什么

稍后,我希望能够做到:

A ains=new A(); //A or other name
ains.method4();

听起来你需要使用一个扩展,但是如果没有更多的信息就很难说了。继承是指当子对象是
a
类型时,而不是当您只需要添加一个方法时。

听起来您需要使用扩展,但如果没有更多信息,则很难判断。继承是指当子对象是
a
类型时,而不是当您只需要添加一个方法时。

仅当您能够在任何地方使用派生类的引用时才使用继承。如果您的唯一意图是使用委托中的方法,请使用委托


另一方面,您也可以尝试扩展。

只有当您能够在任何地方使用派生类的引用时,才可以使用继承。如果您的唯一意图是使用委托中的方法,请使用委托


另一方面,您也可以尝试扩展。

取决于使用场景
A
没有Method4,因此任何接受
A
作为其参数的方法都不能依赖Method4的存在

如果您只需要Method4作为类内部的帮助器,请将其实现为扩展。否则,创建一个从
a
派生的类
B
,以便需要
Method4
的外部类可以可靠地请求a
B
作为其参数,而不是
a

当然,例外情况总是适用的。LINQ是子类化不切实际的一个例子

你在一篇评论中提到需要一处房产。在这种情况下,创建一个
class B:a
是您的主要选择,因为没有扩展属性。另一个选项是创建一个
类B{public a TheA{get;set;}}
,它围绕着a


但如前所述,这取决于实际情况和用法。如果您必须使用
A
,并且需要在此
A
上调用方法,那么扩展方法是您的选择,您不能拥有属性。相反,创建Get/Set方法并将属性值存储在其他地方。

取决于使用场景
A
没有Method4,因此任何接受
A
作为其参数的方法都不能依赖Method4的存在

如果您只需要Method4作为类内部的帮助器,请将其实现为扩展。否则,创建一个从
a
派生的类
B
,以便需要
Method4
的外部类可以可靠地请求a
B
作为其参数,而不是
a

当然,例外情况总是适用的。LINQ是子类化不切实际的一个例子

你在一篇评论中提到需要一处房产。在这种情况下,创建一个
class B:a
是您的主要选择,因为没有扩展属性。另一个选项是创建一个
类B{public a TheA{get;set;}}
,它围绕着a


但如前所述,这取决于实际情况和用法。如果您必须使用
A
,并且需要在此
A
上调用方法,那么扩展方法是您的选择,您不能拥有属性。相反,创建Get/Set方法并将属性值存储在其他地方。

在这种情况下,我通常使用的规则是

我是否只添加了一个行为或数据和/或行为

如果我只是向现有类型添加行为,而不是任何新数据,那么我会添加一个扩展方法。这是获取行为的侵入性最小的方法,并且消除了对深层对象层次结构的需要


如果有一个数据需要添加到该行为中,那么我将考虑继承或打包在另一个类型中。 在这种情况下,我通常遵循的规则是

我是否只添加了一个行为或数据和/或行为

如果我只是向现有类型添加行为,而不是任何新数据,那么我会添加一个扩展方法。这是获取行为的侵入性最小的方法,并且消除了对深层对象层次结构的需要


如果有一个数据需要添加到该行为中,那么我将考虑继承或打包在另一个类型中。 如果我需要添加一个方法和一个属性呢?使用扩展会阻止我使用接口,并迫使我使用类型本身..@Naor如果你在接口上进行扩展,您仍然可以使用它。如果我需要添加一个方法和属性,该怎么办?使用扩展会阻止我使用接口,并迫使我使用类型本身。@Naor如果您在接口上进行扩展,您仍然可以使用它。首先,您可能指的是

ains.method4()
(否则,新方法将是静态的,您不需要实例).由于您创建的实例是一个类a,因此除了使用扩展之外,您别无选择;如果允许您实例化另一个类,则具有所述签名的Method4的a的任何后代也会这样做。这两种方法各有利弊;您的问题不会提供任何有助于支持扩展的指示ion优先于继承(反之亦然)。您是对的,I ment ains.method4()。首先,您可能指的是
ains.method4()
(否则新方法将是静态的,您不需要实例).由于您创建的实例是一个类a,因此除了使用扩展外,您别无选择;如果允许您实例化另一个类,则具有所述签名的Method4的a的任何后代也会这样做。这两种方法各有优缺点;您的问题不是