Csharp/C#教程:如何在C#中动态更改对象的类?分享


如何在C#中动态更改对象的类?

假设我有一个名为Visitor的基类,它有2个子类Subscriber和NonSubscriber。

首先,访问者从NonSubscriber开始,即

NonSubscriber mary = new NonSubscriber(); 

然后在这个“mary”订阅了一些服务,我想将“mary”的类型更改为Subscriber。

这样做的传统方法是什么?

不能这样做。 抱歉。 C#不是动态语言。

您将不得不创建一个新的mary = new Subscriber(); 并复制所有相关的属性。

但更好的方法可能是以不同的方式对其进行建模:向Visitor提供订阅列表。 空列表表示NonSubscriber。

你不能做这种类型的转换。 你应该做的是将玛丽视为访客,当时间到来时,创建一个新的“订阅者”实例:

 Visitor mary = new NonSubscriber(); // Do some Visitor operations ... // Now mary is a Subscriber mary = new Subscriber(); 

您可以使用GOF设计模式StateStrategy来模拟这种行为。 使用这些模式,在运行时似乎已经更改了对象的类。

看来你有一些设计问题。 我认为重新设计代码会更好:

 class Visitor { private bool isSubscriber = false; public bool IsSubscriber { get { return isSubscriber; } } public void Subscribe() { // do some subscribing stuff isSubscriber = true; } public void Unsubscribe() { // do some unsubscribing stuff isSubscriber = false; } } 

您无法在运行时更改变量的类型。 您需要创建一个新实例。

 mary = new Subscriber(); 

创建一个Subscriber构造函数,它将NonSubscriber对象作为参数,或者在NonSubscriber对象上创建一个返回Subscriber的方法,以节省您在多个位置编写mappping代码的过程。

您似乎错误地将信息编码到类层次结构中。 在这里使用不同于分类的模式会更有意义。 例如,仅使用一个类(访问者,或者您可能将其命名为潜在订阅者,无论什么似乎合适)并对关于对象订阅的服务的信息进行编码,将动态变化的行为移动到“策略”模式或其他类似的背后。 您的示例中的细节很少,但您可以在C#中执行的一项操作是创建一个“订阅者”属性,该属性会在更改属性状态时更改对象的行为。

这是一个人为的相关例子:

 class Price { private int priceInCents; private bool displayCents; private Func displayFunction; public Price(int dollars, int cents) { priceInCents = dollars*100 + cents; DisplayCents = true; } public bool DisplayCents { get { return displayCents; } set { displayCents = value; if (displayCents) { this.displayFunction = () => String.Format("{0}.{1}", priceInCents / 100, priceInCents % 100); } else { this.displayFunction = () => (priceInCents / 100).ToString(); } } } public string ToString() { return this.displayFunction(); } } 

 public class User { public Subscription Subscription { get; set; } public void HandleSubscription() { Subscription.Method(); } } public abstract class SubscriptionType { public abstract void Method(); } public class NoSubscription : SubscriptionType { public override void Method() { // Do stuff for non subscribers } } public class ServiceSubscription : SubscriptionType { public override void Method() { // Do stuff for service subscribers } } public class Service2Subscription : SubscriptionType { public override void Method() { // Do stuff for service2 subscribers } } 

认为代码解释了我的答案:)

添加到其他答案和您的评论,您确实可以使用状态模式为您的目的,它将是这样的:

上述就是C#学习教程:如何在C#中动态更改对象的类?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public class MyProgram { public void Run() { Visitor v = new Visitor("Mary"); Debug.Assert(v.SubscriptionLinkText == "Join now"); v.IsSubscribed = true; Debug.Assert(v.SubscriptionLinkText == "Today's special"); v.IsSubscribed = false; Debug.Assert(v.SubscriptionLinkText == "Join now"); } } public class Visitor { public string Name { get; set; } private bool _isSubscribed; public bool IsSubscribed { get { return this._isSubscribed; } set { if (value != this._isSubscribed) { this._isSubscribed = value; this.OnSubscriptionChanged(); } } } private SubscriptionBase _subscription; public string SubscriptionLinkText { get { return this._subscription.LinkText; } } public Visitor(string name) { this.Name = name; this._isSubscribed = false; this.OnSubscriptionChanged(); } private void OnSubscriptionChanged() { // Consider also defining an event and raising it here this._subscription = SubscriptionBase.GetSubscription(this.IsSubscribed); } } abstract public class SubscriptionBase { // Factory method to get instance static public SubscriptionBase GetSubscription(bool isSubscribed) { return isSubscribed ? new Subscription() as SubscriptionBase : new NoSubscription() as SubscriptionBase; } abstract public string LinkText { get; } } public class Subscription : SubscriptionBase { public override string LinkText { get { return "Today's Special"; } } } public class NoSubscription : SubscriptionBase { public override string LinkText { get { return "Join now"; } } } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/956893.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐