第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

創(chuàng)建一個(gè)可以是多種類型的構(gòu)造函數(shù)屬性?

創(chuàng)建一個(gè)可以是多種類型的構(gòu)造函數(shù)屬性?

C#
一只萌萌小番薯 2023-07-22 17:03:51
您好,我很想知道如何在 C# 中創(chuàng)建可以是多種類型的構(gòu)造函數(shù)屬性。我可以按照下面的方式在 python 中生成我想要的內(nèi)容。IE 初始化“this_thing”類的對(duì)象,該對(duì)象可以采用“thing”或“thingy”類的對(duì)象。與我想做的事情等效的Python工作是:class thing:? ? def __init__(self, number):? ? ? ? self.number = number? ? @property? ? def number(self):? ? ? ? return self._number? ? @number.setter? ? def number(self, value):? ? ? ? if not isinstance(value, int):? ? ? ? ? ? raise TypeError('"number" must be an int')? ? ? ? self._number = valueclass thingy:? ? def __init__(self, text):? ? ? ? self.text= text? ? @property? ? def text(self):? ? ? ? return self._text? ? @text.setter? ? def text(self, value):? ? ? ? if not isinstance(value, str):? ? ? ? ? ? raise TypeError('"text" must be a str')? ? ? ? self._text = valueclass this_thing:? ? def __init__(self, chosen_thing, name_of_the_thing):? ? ? ? self.chosen_thing = chosen_thing? ? ? ? self.name_of_the_thing = name_of_the_thing?? ? @property? ? def chosen_thing(self):? ? ? ? return self._chosen_thing? ? @chosen_thing.setter? ? def chosen_thing(self, value):? ? ? ? if (not isinstance(value, (thing, thingy))):? ? ? ? ? ? raise TypeError('"chosen_thing" must be a thing or thingy')? ? ? ? self._chosen_thing = value? ? @property? ? def name_of_the_thing(self):? ? ? ? return self._name_of_the_thing? ? @name_of_the_thing.setter? ? def name_of_the_thing(self, value):? ? ? ? if not isinstance(value, str):? ? ? ? ? ? raise TypeError('"name_of_the_thing" must be a str')? ? ? ? self._name_of_the_thing = valuesome_thing = thing(10)another_thing = thingy("10")new_thing = this_thing(some_thing, "Some Thing")another_new_thing = this_thing(another_thing, "Another Thing")在 C# 中,我有獨(dú)立工作的“Thing”和“Thingy”類。但我想創(chuàng)建一個(gè)新類“ThisThing”,它可以采用“Thing”類或“Thingy”類的對(duì)象,但我不確定如何啟用此操作。在 C# 中嘗試之后,看起來(lái)最可行的解決方案是將“ThisThing”類分成兩個(gè)單獨(dú)的類。看來(lái) C# 在操作類類型方面不如 Python 靈活。當(dāng)然,如果您知道如何在 C# 中重現(xiàn)上述 python 代碼,請(qǐng)發(fā)表評(píng)論。知道的話會(huì)很方便。
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊

dynamic理論上,您可以使用或弱類型(如 )在 C# 中復(fù)制動(dòng)態(tài)類型系統(tǒng)object。

但是,正如您在 Python 中所做的那樣,您將需要在運(yùn)行時(shí)不斷進(jìn)行類型一致性檢查

這是原始 Python 代碼的轉(zhuǎn)換dynamic(不要這樣做)

public class Thing

{

? ? public Thing(int number) { Number = number; }

? ? public int Number { get; }

}


public class Thingy

{

? ? public Thingy(string text) { Text = text; }

? ? public string Text { get; }

}


public class ThisThing

{

? ? public ThisThing(dynamic chosenThing, string nameOfTheThing)

? ? {

? ? ? ? ChosenThing = chosenThing;

? ? ? ? NameOfTheThing = nameOfTheThing;

? ? }


? ? // Cache the accepted types

? ? private static readonly ICollection<Type> AcceptedTypes = new HashSet<Type> { typeof(Thing), typeof(Thingy) };

? ? private dynamic _chosenThing;

? ? public dynamic ChosenThing

? ? {

? ? ? ? get => _chosenThing;

? ? ? ? private set

? ? ? ? {

? ? ? ? ? ? if (!AcceptedTypes.Contains(value.GetType()))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? throw new ArgumentException($"ChosenThing must be {string.Join(" or ", AcceptedTypes.Select(t => t.Name))}");

? ? ? ? ? ? }

? ? ? ? ? ? _chosenThing = value;

? ? ? ? }

? ? }


? ? public string NameOfTheThing { get; }

}

根據(jù)您的測(cè)試用例,可以執(zhí)行以下操作:


var someThing = new Thing(10);

var anotherThing = new Thingy("10");

var newThing = new ThisThing(someThing, "Some Thing");

var anotherNewThing = new ThisThing(anotherThing, "Some Thing");


Console.WriteLine(newThing.ChosenThing.Number);

Console.WriteLine(anotherNewThing.ChosenThing.Text);

弱類型的問(wèn)題是錯(cuò)誤只能在運(yùn)行時(shí)被檢測(cè)到。下面的代碼都會(huì)通過(guò)編譯器(因?yàn)镃hosenThing是dynamic),但會(huì)在運(yùn)行時(shí)崩潰。


var invalidThing = new ThisThing("Invalid for string types", "Invalid");

// newThing has a Number, not a Text property

Console.WriteLine(newThing.ChosenThing.Text);

// Vice Versa

Console.WriteLine(anotherNewThing.ChosenThing.Number);

使用通用接口的更好方法


一種更容易接受的面向?qū)ο蠓椒ㄊ菫椤翱山邮艿摹鳖愋吞峁┮粋€(gè)公共基類或接口,然后使用它來(lái)代替。這樣您將獲得編譯時(shí)類型安全檢查。


// Common interface

public interface IThing { }


public class Thing : IThing

{

? ? public Thing(int number) { Number = number; }

? ? public int Number { get; }

}


public class Thingy : IThing

{

? ? public Thingy(string text) { Text = text; }

? ? public string Text { get; }

}

由于通用接口,IThing現(xiàn)在可以用于約束傳遞給的允許類型ThisThing(即必須符合約定IThing),并且這些類型約束在編譯時(shí)強(qiáng)制執(zhí)行:


public class ThisThing

{

? ? public ThisThing(IThing chosenThing, string nameOfTheThing)

? ? {

? ? ? ? ChosenThing = chosenThing;

? ? ? ? NameOfTheThing = nameOfTheThing;

? ? }


? ? public IThing ChosenThing { get; }


? ? public string NameOfTheThing { get; }

}

Thing您現(xiàn)在可以公開(kāi)合約之間以及Thingy通過(guò)合約的任何常見(jiàn)功能IThing。


就目前而言,該接口沒(méi)有通用性,因此您需要將 向下轉(zhuǎn)換IThing為子類之一,這再次違反了SOLID Liskov Substitution Principle:


Console.WriteLine(((Thing)newThing.ChosenThing).Number);

Console.WriteLine(((Thingy)anotherNewThing.ChosenThing).Text);

所以你真正想要的是抽象共性,例如


public interface IThing?

{?

? ? ?int CalculateValue();

}

現(xiàn)在,兩者Thing都Thingy將被迫提供此抽象的實(shí)現(xiàn),然后接口的使用者現(xiàn)在可以安全地使用該接口,而無(wú)需對(duì)具體實(shí)例的實(shí)際類型進(jìn)行任何進(jìn)一步的假設(shè):


Console.WriteLine(anyIThing.CalculateValue());


查看完整回答
反對(duì) 回復(fù) 2023-07-22
  • 1 回答
  • 0 關(guān)注
  • 144 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)